![](/img/trans.png)
[英]maven - separate modules for interfaces and implementation with Spring
[英]Multiple maven modules to separate tests, api and implementation
我想创建一个maven项目,在一个api模块中声明的几个接口的单独模块中有几个实现(对于上下文,我正在编写一个java持久性实验室,学生必须多次实现服务和存储库,从简单的JDBC开始到JPA然后spring-data-jpa)。
项目中有几个maven模块:
multiple-modules
模块,包括三个子模块 api
模块,包含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;
}
对于这两个类,代码在src/main/java
目录而不是src/test/java
目录中,因为我使用首选方法来创建包含测试类的jar :
test子模块的相关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(){return true; }}
和测试的模板实现(在src/test/java
):
import org.junit.Before;
public class TemplateInitialization extends Template {
@Before
public void before() {
mustReturnTrue = new MustReturnTrueImpl();
}
}
pom.xml
模块的相关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的方法。
您的模板初始化应该直接在测试类中完成:
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标准将测试放在实施代码中(在主项目中)。
在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中实现测试
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.