繁体   English   中英

Maven / junit项目组织

[英]Maven/junit project organization

我有三个包:

  • 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开头或以TestTestCase结尾。 因此,您的测试将集中在FooTestBase ,并且将在每个子类中执行它们。

您的测试将只编写一次,并且您的设置/拆卸将针对每个实现。

刚刚遇到了这个: https : //maven.apache.org/guides/mini/guide-attached-tests.html

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

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

更新:应该可行!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM