我有三个包:
- 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/