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

2022-09-04 03:10:11

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

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

我的测试类继承自 并用于设置 .AbstractTransactionalJUnit4SpringContextTests@ContextCofigurationApplicationContext

例如,弹簧控制器的测试类:

@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。我有单独的配置用于tesing,驻留在每个模块的测试/资源中(并且具有后缀“-test”)。如果我在 Eclipse 中运行 JUnit 测试,这一切都有效(类编译、运行和 JUnit 测试成功)。

现在来看看我的问题:使用Maven运行测试将不起作用!(例如,在“Run As”>“Maven install”(我使用m2eclipse)的情况下)。具体来说,它将引发以下异常:my-root

java.io.FileNotFoundException: class path resource [applicationContext-logic-test.xml] 無法開啟,因為它不存在。

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

我该如何解决这个问题?


答案 1

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

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

但你可以做的是:

  1. 配置模块以使用 jar:test-jar 创建测试 JARmy-logic
  2. 将模块配置为依赖于此测试 JAR(使用作用域)。my-webapptest

对于#1,您必须在pom中配置Maven Jar插件.xml: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>

Maven将创建一个包含期间内容的JAR,并安装/部署它。target/test-classespackage

对于 #2,在 pom 中声明对测试 JAR 的依赖.xml: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>

这应该可以做到。


答案 2

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

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


推荐