1) "base tests"? As I listed, there is only one class in the a-test project and that is used during tests by projects which use the proj-a project. Project proj-a does not depend on this class, so I'm not sure that in this case the implementation needs to be separate from the API for dependency reasons. Are there other reasons to separate the API from the implementation?
2) Let's assume for a moment that in project proj-a, the AFactory class is defined: public class AFactory { public static A getInstance() { // Do some work to create the instance return ?; } } The matching AFactory class in project a-test would be defined: public class AFactory { static A impl; public static A getInstance() { return impl; } public static setInstance(A touse) { impl = touse; } } As long as the a-test version of the class is in front of the proj-a version in the classpath during tests, the unit tests can use the setInstance method to preload the factory with an appropriate mock object which implements interface A before the test runs. In this manner, the unit tests in proj-b can simulate the operation of proj-a without requiring whatever resources are used by class AImpl. I realize that this is a slightly different use case than what you are doing, but it is still a dependency of proj-b on test classes from proj-a. -----Original Message----- From: Dave Neuer [mailto:[EMAIL PROTECTED] Sent: Thursday, September 29, 2005 11:39 To: Maven Users List Subject: RE: Cross-project dependencies on unit test code Answers: 1) There needs to be an API package so that the Impl and Test packages can both depend on it (otherwise your base tests would depend on the impl classes, but your impl depends on the base tests, creating a circular dependancy). 2) How do you ensure that any factory returns any kind of specific implementation of an interface in general? You have some configuration which specifies which impl to return at runtime (the config would probably be stored w/ your tests i.e., src/test/resources). I find Spring quite handy for this type of setup. Also, you'd want to define your Mocks in Proj a-test in src/main/java, rather than src/test/java otherwise they won't get exported. Dave -----Original Message----- From: Allison, Bob [mailto:[EMAIL PROTECTED] Sent: Wednesday, September 28, 2005 1:37 PM To: Maven Users List; [EMAIL PROTECTED]; Brett Porter Subject: RE: Cross-project dependencies on unit test code Here is the pattern I was going to build: Project proj-a creates a.jar which contains: -- Interface A which is the API for the jar -- Class AImpl which implements the API -- Class AFactory which creates implementations of interface A Project a-test creates a-test.jar which contains a MockObjects version of class AFactory which allows unit tests to preload the factory with a mock-object implementation of interface A to be returned by the factory Project proj-b uses a.jar, so needs to define a dependency on a.jar with compile scope and a-test.jar with test scope. My questions: 1) Is there a reason why the API class (interface A) needs to be in a separate project from the implementation classes (AImpl and AFactory)? 2) How do I define the dependencies in project proj-b to ensure that the mock-objects version of AFactory gets used during unit tests? -----Original Message----- From: Tim Dysinger [mailto:[EMAIL PROTECTED] Sent: Wednesday, September 28, 2005 12:39 To: [EMAIL PROTECTED]; Brett Porter Cc: Maven Users List Subject: Re: Cross-project dependencies on unit test code Ok. Let's say we did it that way. We are still faced with the same problem with the maven-eclipse-plugin. Maven-eclipse-plugin does not like having your source and test directories the same. <sourceDirectory>${basedir}/src/java</sourceDirectory> <unitTestSourceDirectory>${basedir}/src/java</unitTestSourceDirectory> I can't do this without using eclipse. The plugin, in this case, would generate a bogus .classpath file. Putting the junit code in src/java is the only way I know that maven will publish your jar so other projects can depened on it. If you just put your tests in src/test, maven will publish an empty jar and the dependant project will fail to compile. -Tim On Wed, 2005-09-28 at 08:42 +1000, Brett Porter wrote: > This has been asked 2 or 3 times this week. IIRC someone was going to > write up their experience doing it? Would anyone like to volunteer to > add it to the wiki? > > - Brett > > On 9/28/05, Raphaël Piéroni <[EMAIL PROTECTED]> wrote: > > Hi Tim, > > > > May you try with something like this : > > wrapper > > +- core-api > > +- core-test (depend only on api) > > +- core-impl (with some test cases - depends on core-api and core-test > > the later with scope test) > > +- use-core-1 (depend on core-impl, depends on core-test at scope test - > > the test cases must not depend on core-impl's tests) > > +- use-core-2 (...) > > > > Then you move all the common test practices to the core-test project. > > > > May that helps. > > > > Regards, > > > > Raphaël. > > > > Tim Dysinger a écrit : > > > > >I have a "best practices" question. > > > > > >I have a multi-project setup with three sub-projects. Two of the > > >sub-projects have tests which subclass tests in the "core" project. > > >However, just having the sub-projects depend on "core" does not expose > > >the unit test code and the build fails with a compilation error. > > > > > >If I put the unit tests into the src/java directory, then the eclipse > > >plugin generates duplicate source directories "src/java" in > > >the .classpath file. > > > > > >I imagine that I could break out all the tests into other sub-projects > > >but that seems clumsy and would double the number of projects in my > > >multi-project setup. > > > > > >How do I deal with this elegantly? > > > > > >-Tim > > > > > > > > > > > >--------------------------------------------------------------------- > > >To unsubscribe, e-mail: [EMAIL PROTECTED] > > >For additional commands, e-mail: [EMAIL PROTECTED] > > > > > > > > > > > > > > > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > For additional commands, e-mail: [EMAIL PROTECTED] > > > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]