run maven tests from classpath
Asked Answered
H

3

4

In order to clean up something of a giant mess, I set out to put the code of my tests all in one ordinary java project (all in src/main/java), and then declare that as a <scope>test</scope> dependency in another project, and expect the tests to run.

No such luck. surefire wants to just run the tests that it can see in the sources.

I can see a sadly obvious solution here involving the build-helper-plugin and adding the tests into the test compilation environment as a source directory, but I was hoping to avoid it.

In case anyone is wondering, the reason for all this is that the POM configuration for use of the failsafe plugin to run some integration tests got so complex that I wanted to split out the compiling of the test classes from the running of the tests.

Hyperkeratosis answered 22/8, 2010 at 21:25 Comment(0)
T
8

This is now possible with Maven Surefire v2.15. Simply add the following kind of configuration to the surefire plugin:

<build>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.15</version>
    <configuration>
      <dependenciesToScan>
        <dependency>com.group.id:my-artifact</dependency>
        <dependency>com.group.id:my-other-artifact</dependency>
      </dependenciesToScan>
      ...
    </configuration>
    ...
  </plugin>
  ...
</build>

You should also declare the actual dependencies in the dependencies section:

<dependencies>
  <dependency>
    <groupId>com.group.id</groupId>
    <artifactId>my-artifact</artifactId>
    <type>test-jar</type>
    <version>1.1</version>
    <scope>test</scope>
  </dependency>
  <dependency>
    <groupId>com.group.id</groupId>
    <artifactId>my-other-artifact</artifactId>
    <type>test-jar</type>
    <version>1.1</version>
    <scope>test</scope>
  </dependency>
</dependencies>
Trimurti answered 11/6, 2013 at 10:29 Comment(1)
You will probably also need the com.group.id:my-artifact "main jar" (not just the test-jar), but otherwise this works like a charmAleishaalejandra
A
3

No such luck. surefire wants to just run the tests that it can see in the sources.

This is currently not possible out of the box, surefire just looks at classes in target/test-classes:

This is actually logged as SUREFIRE-569 - There should be a way to run unit tests from a dependency jar.

I can see a sadly obvious solution here involving the build-helper-plugin and adding the tests into the test compilation environment as a source directory, but I was hoping to avoid it.

The current workaround is to use dependency:unpack to unpack the jar into target/test-classes before the test phase.

Argali answered 22/8, 2010 at 21:40 Comment(5)
when I do this, I get NoClassDefFound errors for org.junit.Assert! But this may yet be some prank of something else.Hyperkeratosis
@Hyperkeratosis Hmm... weird. I fail to understand why you would get that NoClassDefFoundError. I might try this, but later.Argali
I filed a bug report. I have some ideas, but I made it go away by seemingly unrelated tweaks to the classpath. It might have results from Eclipse writing a class file at the wrong moment.Hyperkeratosis
@bmargulies: do you have a dependency to junit in the artifact that executes the tests? (not the artifact you are unpacking)Diligent
@sean yes I did when I had the problem, and -X showed it in the classpath. However, the error message eventually suggested that it was, in fact, crazily looking for 'Assert' and not 'org.junit.Assert', so I went on a cleaning jihad and things got better.Hyperkeratosis
S
1

Can't you do it the other way round?

I mean put the code the src/test/java, depend on your main module, and run the tests in your test module?

Schroer answered 22/8, 2010 at 21:32 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.