簡體   English   中英

多個maven模塊分開測試,api和實現

[英]Multiple maven modules to separate tests, api and implementation

我想創建一個maven項目,在一個api模塊中聲明的幾個接口的單獨模塊中有幾個實現(對於上下文,我正在編寫一個java持久性實驗室,學生必須多次實現服務和存儲庫,從簡單的JDBC開始到JPA然后spring-data-jpa)。

項目中有幾個maven模塊:

  • 根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模塊

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

任何想法 ?

編輯1

我的印象是,問題是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM