我想创建一个maven项目,在一个 api 模块中声明的几个接口的单独模块中有几个实现(对于上下文,我正在编写一个java持久性实验室,学生必须实现几个将服务和存储库的时间从简单的JDBC开始到JPA然后是spring-data-jpa)。
项目中有几个maven模块:
multiple-modules
模块,包括三个子模块api
模块api-tests
模块,包含与API接口相关的测试main
模块,其中包含一个API实现主maven项目声明了三个子模块:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.kartoch.stack</groupId>
<artifactId>multiple-modules</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>api</module>
<module>main</module>
<module>tests</module>
</modules>
</project>
API声明接口:
public interface MustReturnTrue {
boolean askMeTrue();
}
api子模块的相关pom.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>multiple-modules</artifactId>
<groupId>org.kartoch.stack</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>
<artifactId>api</artifactId>
</project>
在此模块中,针对API接口编写测试:
import org.junit.Test;
import static org.junit.Assert.assertTrue;
public class MustReturnTrueTest extends Template {
@Test
public void testAskMeTrue() {
assertTrue(mustReturnTrue.askMeTrue());
}
}
由于API接口的实现依赖于子模块,因此测试包中提供了一个抽象类,需要在每个实现模块中实现:
public abstract class Template {
public MustReturnTrue mustReturnTrue;
}
对于这两个类,当我使用the preferred way to create a jar containing test classes时,代码位于src/main/java
目录而不是src/test/java
目录中:
测试子模块的相关pom.xml
。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>multiple-modules</artifactId>
<groupId>org.kartoch.stack</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>
<artifactId>api-tests</artifactId>
<dependencies>
<dependency>
<groupId>org.kartoch.stack</groupId>
<artifactId>api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
</project>
最后,主模块包含API接口的一个实现(在src/main/java
中):
公共类MustReturnTrueImpl实现MustReturnTrue { public boolean askMeTrue(){ 返回true; } }
测试的模板实现(在src/test/java
中):
import org.junit.Before;
public class TemplateInitialization extends Template {
@Before
public void before() {
mustReturnTrue = new MustReturnTrueImpl();
}
}
主要子模块的相关pom.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>multiple-modules</artifactId>
<groupId>org.kartoch.stack</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>
<artifactId>main</artifactId>
<dependencies>
<dependency>
<groupId>org.kartoch.stack</groupId>
<artifactId>api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.kartoch.stack</groupId>
<artifactId>api-tests</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
我期望在测试期间测试模块中的测试是在实现Template
的类初始化后执行的。
但由于未知原因,测试不会在main
测试生命周期中执行:
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Results :
Tests run: 0, Failures: 0, Errors: 0, Skipped: 0
有什么想法吗?
我的印象是,问题是heriting没有按预期工作。由于TemplateInitialization
是不包含测试的heriting模板,因此没有执行测试:MustReturnTrueTest
中的测试不会“神奇地”导入。我需要一种在测试之前在运行时加载TemplateInitialization的方法。
答案 0 :(得分:1)
您的模板初始化应直接在测试类中完成:
import org.junit.Test;
import static org.junit.Assert.assertTrue;
public class MustReturnTrueTest extends Template {
@Before
public void before() {
mustReturnTrue = new MustReturnTrueImpl();
}
@Test
public void testAskMeTrue() {
assertTrue(mustReturnTrue.askMeTrue());
}
}
如果在每次测试之前需要实例化,请使用JUnit @Before
注释。
如果您需要在测试类中的所有测试之前进行一次instanciation,请使用@BeforeClass
。
编辑:
根据Maven标准,我建议你按照实施代码(在主项目中)进行测试。
答案 1 :(得分:-1)
在maven标准测试中写入测试项目,最后尊重一些符号:http://maven.apache.org/guides/introduction/introduction-to-the-pom.html
<build>
<directory>target</directory>
<outputDirectory>target/classes</outputDirectory>
<finalName>${artifactId}-${version}</finalName>
<testOutputDirectory>target/test-classes</testOutputDirectory>
<sourceDirectory>src/main/java</sourceDirectory>
<scriptSourceDirectory>src/main/scripts</scriptSourceDirectory>
<testSourceDirectory>src/test/java</testSourceDirectory>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
<testResources>
<testResource>
<directory>src/test/resources</directory>
</testResource>
</testResources>
</build>
因此,如果您不想覆盖默认的pom配置,则必须在测试模块中的src / test / java中实现测试