2010-08-25 65 views
13

我有我设置使用Maven多模块Spring项目:不在classpath中的依赖关系的测试资源?

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

我的测试类从AbstractTransactionalJUnit4SpringContextTests继承和使用@ContextCofiguration用于设置ApplicationContext

E.g.弹簧控制器的测试类:

@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运行测试将无法正常工作!(例如使用“Run As”>“Maven install”my-root(我使用m2eclipse))。具体来说,它会抛出以下异常:

java.io.FileNotFoundException:类路径资源[的applicationContext-逻辑的test.xml]不能打开,因为它不exist`

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

我该如何解决这个问题?

回答

13

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

不,事实上并非如此。首先,Maven使用通常通过本地存储库解决的二进制依赖关系。其次,二进制依赖不包括测试内容。

但是你可以做的是:

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

对于#1,您必须在pom中配置Maven Jar Plugin。的my-logic XML:

<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将在package创建的target/test-classes内容的JAR和安装/部署。

#2,宣布在测试JAR依赖于my-webapp pom.xml中:

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

应该这样做。

+0

非常感谢这个优秀的答案!我用这个解决方案,它的工作原理。现在您已经解释了这一点,对我来说很明显,所有(外部)依赖项的测试资源都不包含在classpath中。他们应该如何?但不知何故,如果我自己模块的资源被包括在内,那将会很好。即使我不知道这究竟会发生什么,现在我想到了;) – apropoz 2010-08-26 10:07:15

+0

@apropoz不客气。 Maven的想法是模块是自包含的:您可以在没有兄弟的情况下签出单个模块并构建它。任何涉及相对路径的事情都会破坏这一点,这是不可取的。 – 2010-08-26 10:34:00

1

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

如果你想完成你正在试图做的,你应该创建一个包含你需要测试的资源项目,并是什么测试范围的我的两个逻辑的依赖和我-web应用