Junit 在经历了所有的@Before';发生了什么事?
我们在层次结构中一直使用@Before,以便在测试执行之前将一些测试数据插入数据库。我想在@Test开始运行之前将所有数据提交到数据库 实现这一点的一种方法是将数据作为该测试类“@Before”方法中的最后一步提交。但我们有数百个这样的类,不想进去修改所有这些 我已经玩过ExternalResource@Rule和TestWatcher@Rule……但是在所有的@Before事件发生之后,他们没有办法加入进来 我想我需要考虑构建一个定制的TestRunner来实现这一点Junit 在经历了所有的@Before';发生了什么事?,junit,Junit,我们在层次结构中一直使用@Before,以便在测试执行之前将一些测试数据插入数据库。我想在@Test开始运行之前将所有数据提交到数据库 实现这一点的一种方法是将数据作为该测试类“@Before”方法中的最后一步提交。但我们有数百个这样的类,不想进去修改所有这些 我已经玩过ExternalResource@Rule和TestWatcher@Rule……但是在所有的@Before事件发生之后,他们没有办法加入进来 我想我需要考虑构建一个定制的TestRunner来实现这一点 这条路对吗?我觉得你要找
这条路对吗?我觉得你要找的东西不一致。设置一些数据并提交它们是非常接近的操作,不应该属于不同的位置。相反,我宁愿将它们放在一个函数中,并用实际参数设置为要插入的值来调用它。或者使用SQL字符串作为实际参数。并从@Before中调用此函数 如果你坚持的话,那么做没有问题。为Junit类创建子类:
package ...;
import org.junit.Before;
public class NewAndBetterYourTest1 extends YourTest1 {
@Override
@Before
public void setUp() {
super.setUp(); // this is where you are setting everything.
makeCommits();
}
}
只不过别忘了启动这些新测试如果没有自定义的运行程序,您无法完成所要求的任务,那么您可以确保在
@Before
方法中创建的所有数据都按照规则提交:
public class LocalDatabase extends ExternalResource {
private DataSource dataSource;
@Override
protected void before() {
dataSource = createLocalDatabase();
}
@Override
protected void after() {
try {
destoyLocalDatabase(dataSource);
} finally {
dataSource = null;
}
}
public void run(Callback callback) {
if (dataSource == null) {
throw new IllegalStateException("No DataSource");
}
Collection con = null;
try {
con = ds.getConnection(DB_USERNAME, PASSWORD);
callback.execute(con);
con.commit();
} finally {
if (con != null) con.close();
}
}
您可以在基类中将此作为规则:
public DatabaseTest {
@Rule
public LocalDatabase final localDatabase = new LocalDatabase();
}
并且可以在任何子类的@Before
方法中使用它
public UserDaoTest extends DatabaseTest {
@Before
public void populateInitialData() {
localDatabase.run(new Callback() {
@Override
public void execute(Connection con) {
...
}
});
}
...
}
让您调用的实用方法作为每个测试的第一行怎么样?编写自己的跑步记录的缺点是,你将能够使用其他跑步者(Spring、Theory等)。好吧,那会管用的。但它与我刚才提到的替代品非常接近。把这件事做好是很重要的,所以我希望有一个漂亮的把戏能让我进去。我不是第一个需要这个的人,对吧?我最好的选择是使用sed或您最喜欢的脚本语言中的脚本“进入并修改所有这些”。