![](/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.