Maven / junit项目组织

时间:2015-04-25 21:30:38

标签: 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测试可以依赖它。但这听起来有些不对劲。有更好的主意吗?

2 个答案:

答案 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>

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

更新:它的确有效!