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

时间:2010-08-25 23:58:55

标签: java spring maven-2 junit classpath

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

my-root (pom)
    - my-logic
    - my-webapp (depending on my-logic)
    - my-consoleapp (depending on my-logic)

我的测试类继承自AbstractTransactionalJUnit4SpringContextTests并使用@ContextCofiguration设置ApplicationContext

E.g。 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;
    ...
}

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

现在我的问题:使用Maven运行测试将无效!(例如,在my-root上使用“运行方式”>“Maven安装”(我使用m2eclipse))。具体来说,它将抛出以下异常:

  

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

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

我该如何解决?

2 个答案:

答案 0 :(得分:14)

  

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

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

但你能做的是:

  1. 使用jar:test-jar
  2. 配置my-logic模块以创建测试JAR
  3. 配置my-webapp模块以依赖此测试JAR(使用test范围)。
  4. 对于#1,您必须在my-logic的pom.xml中配置Maven Jar插件:

    <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>
    

    Maven将在target/test-classes期间创建一个内容为package的JAR并安装/部署它。

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

    <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>
    

    应该这样做。

答案 1 :(得分:1)

这是设计的。测试资源不会放入输出工件中,因此即使在单元测试类路径中也无法访问您所依赖的任何测试依赖项。

如果你想完成你想要做的事情,你应该创建一个项目,其中包含测试所需的资源,并使其成为my-logic和my-webapp的测试范围依赖