不在类路径中的依赖项的测试资源?

apr*_*poz 14 java junit spring maven-2 classpath

我有一个使用Maven设置的多模块Spring项目:

my-root (pom)
    - my-logic
    - my-webapp (depending on my-logic)
    - my-consoleapp (depending on my-logic)
Run Code Online (Sandbox Code Playgroud)

我的测试类继承AbstractTransactionalJUnit4SpringContextTests@ContextCofiguration用于设置ApplicationContext.

例如Spring Controller的测试类:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { 
  "classpath:applicationContext-logic-test.xml",
  "classpath:applicationContext-web-test.xml"})
public class ControllerTest extends AbstractTransactionalJUnit4SpringContextTests {

  @Autowired
    private ApplicationContext applicationContext;
    ...
}
Run Code Online (Sandbox Code Playgroud)

如您所见,每个模块都有一个配置XML.我有单独的配置用于测试,驻留在每个模块的测试/资源中(另外还有后缀"-test").如果我在Eclipse中运行JUnit测试,这一切都有效(类编译,运行并且JUnit测试成功).

现在我的问题:使用Maven运行测试将无法正常工作!(例如,使用"Run As">"Maven install" my-root(我使用m2eclipse)).具体来说,它将抛出以下异常:

java.io.FileNotFoundException:类路径资源[applicationContext-logic-test.xml]无法打开,因为它不存在

似乎Maven没有将文件添加my-logic/src/test/resources到运行单元测试时设置的类路径中my-webapp.

我该如何解决这个问题?

Pas*_*ent 14

似乎Maven没有将文件添加my-logic/src/test/resources到运行my-webapp的单元测试时设置的类路径中.

不,事实上,它没有.首先,Maven使用始终通过本地存储库解析的二进制依赖项.其次,二进制依赖项不包括测试内容.

但你能做的是:

  1. 配置my-logic模块以使用创建测试JARjar:test-jar
  2. 配置my-webapp模块依赖于此测试JAR(使用test范围).

对于#1,您必须在pom.xml中配置Maven Jar插件my-logic:

<project>
  <build>
    <plugins>
     <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-jar-plugin</artifactId>
       <version>2.2</version>
       <executions>
         <execution>
           <goals>
             <goal>test-jar</goal>
           </goals>
         </execution>
       </executions>
     </plugin>
    </plugins>
  </build>
</project>
Run Code Online (Sandbox Code Playgroud)

Maven将创建一个包含in target/test-classes期间内容的JAR package并安装/部署它.

对于#2,在pom.xml中声明对测试JAR的依赖my-webapp:

<project>
  ...
  <dependencies>
    <dependency>
      <groupId>com.myco.app</groupId>
      <artifactId>foo</artifactId>
      <version>1.0-SNAPSHOT</version>
      <type>test-jar</type>
      <scope>test</scope>
    </dependency>
  </dependencies>
  ...
</project>
Run Code Online (Sandbox Code Playgroud)

应该这样做.