我有三个包:
我有一堆junit测试,应该运行两次:再次使用FooMySQL,再次使用FooPostgreSQL。它们是相同的测试,因为API对于两种实现都应该具有相同的行为,只有设置和拆卸略有不同。
问题:我应该在哪里定义这些测试?最合乎逻辑的地方似乎是在Foo。但是,在Foo中,它们不可执行,因为Foo不知道任何实现。我可以把它们放到FooMySQL中,但看起来我必须在FooPostgreSQL上有一个完整的副本,因为在Foo中定义的任何“测试”代码都不能通过来自FooMySQL等的maven依赖机制来引用(这是正确的,或许是我错过了一招?)
或者我可以创建一个单独的FooTests项目,FooMySQL和FooPostgreSQL测试可以依赖它。但这听起来有些不对劲。有更好的主意吗?
答案 0 :(得分:2)
你应该知道的第一件事是你应该进行单元测试的是你的实现。总是。我认为你倾向于这一点,但我不确定,因为你提到了测试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
或{{1}结尾}。因此,您的测试将集中在TestCase
中,并且将在每个子类中执行。
您的测试只会写一次,而您的设置/拆卸将特定于每个实施。
答案 1 :(得分:0)
刚刚发现了这个:https://maven.apache.org/guides/mini/guide-attached-tests.html
<dependencies>
<dependency>
...
<type>test-jar</type>
<scope>test</scope>
</dependency>
</dependencies>
这可以更优雅地解决我的问题;调查。
更新:它的确有效!