多个maven模块分开测试,api和实现

时间:2016-07-11 09:31:04

标签: java maven junit

我想创建一个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;
}

对于这两个类,当我使用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

有什么想法吗?

编辑1

我的印象是,问题是heriting没有按预期工作。由于TemplateInitialization是不包含测试的heriting模板,因此没有执行测试:MustReturnTrueTest中的测试不会“神奇地”导入。我需要一种在测试之前在运行时加载TemplateInitialization的方法。

2 个答案:

答案 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中实现测试