Maven/junit 项目组织

Maven/junit project organization

我有三个包裹:

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

问题:我应该在哪里定义那些测试?最合乎逻辑的地方似乎是在 Foo 中。但是,在 Foo 中,它们不可执行,因为 Foo 不知道任何实现。我可以将它们放入 FooMySQL,但看来我必须在 FooPostgreSQL 上拥有完整副本,因为无法通过 Foo[= 的 Maven 依赖机制引用 Foo 中定义的任何 "test" 代码28=] 等等(这是正确的,还是我漏掉了一个技巧?)

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

您应该知道的第一件事是您应该 unit-test 是您的实现。总是。我认为你倾向于那个,但我不确定,因为你提到了测试 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 不会被视为测试 class 因为它不以 Test 开头或以 Test 结尾或TestCase。因此,您的测试将集中在 FooTestBase 中,并且它们将在每个 child class.

中执行

您的测试将只编写一次,并且您的 setup/teardown 将特定于每个实现。

刚刚发现这个:https://maven.apache.org/guides/mini/guide-attached-tests.html

<dependencies>
 <dependency>
 ...
  <type>test-jar</type>
  <scope>test</scope>
 </dependency>
</dependencies>

这样可以更优雅地解决我的问题;正在调查。

更新:它应该有效!