java - Maven/junit项目组织

标签 java maven junit

我有三个包:

  • Foo 提供了一定的 API
  • FooMySQL(依赖于 Foo)使用 MySQL 实现 Foo API
  • FooPostgreSQL(依赖于 Foo)使用 PostgreSQL 实现 Foo API

我有一堆 junit 测试,应该运行两次:再次运行 FooMySQL,再次运行 FooPostgreSQL。它们是相同的测试,因为 API 对于两种实现的行为应该相同,只有设置和拆卸略有不同。

问题:我应该在哪里定义这些测试?最符合逻辑的地方似乎是 Foo。然而,在 Foo 中,它们不可执行,因为 Foo 不知道任何实现。我可以将它们放入 FooMySQL,但看来我必须在 FooPostgreSQL 上有一个完整的副本,因为 Foo 中定义的任何“测试”代码都不能通过 FooMySQL 等的 maven 依赖机制引用。(这是正确的,或者也许我错过了一个技巧吗?)

或者,我可以创建一个单独的 FooTests 项目,FooMySQL 和 FooPostgreSQL 测试可以依赖该项目。但这听起来也是错误的。有更好的办法吗?

最佳答案

您应该知道的第一件事是您应该对您的实现进行单元测试。总是。我认为你倾向于这一点,但自从你提到测试 Foo 以来我不确定,我只是想确保它是成立的。

所以我们就这样做,而不需要将所有测试都进行两次。

public abstract class FooTestBase {
  protected abstract Foo getFoo();
  @Test public void testBarMethod() {
    // Do some tests calling getFoo().
  }
}

public class FooMysqlTest extends FooTestBase {
  @Before public void setUp() {
    // Do stuff
  }
  @After public void tearDown() {
    // Do stuff
  }
  @Override protected Foo getFoo() {
    return new FooMysql();
  }
}

public class FooPostgresqlTest extends FooTestBase {
  @Before public void setUp() {
    // Do stuff
  }
  @After public void tearDown() {
    // Do stuff
  }
  @Override protected Foo getFoo() {
    return new FooPostgresql();
  }
}

由于你使用Maven,默认FooTestBase不会被视为测试类,因为它不以 Test 开头或以 Test 结尾或TestCase 。因此,您的测试将集中在 FooTestBase 中它们将在每个子类中执行。

您的测试将仅编写一次,并且您的设置/拆卸将特定于每个实现。

关于java - Maven/junit项目组织,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29870959/

相关文章:

java - Java中的音频指纹识别系统

java - 有没有办法在没有安装maven的情况下从自动化庄园中的pom.xml下载依赖项?

maven - 从属性文件动态加载数据到 jbehave 故事

java - 展平静态成员类中的 JUnit 测试

java - 从命令行运行 JUnit 测试套件

java - 使用ThreadPool顺序执行类似的任务

java - 在 Java 中使用比较器

java - 使用 Struts2 标签转义字符串

eclipse - 在 Eclipse 中全局禁用 Maven 工作区解析

java - org.junit 包和 junit.framework 包有什么区别?