【发布时间】:2012-03-11 15:53:52
【问题描述】:
我正在寻找一种方法来针对多个 DataSources 运行一些 TestNG 测试。我已经看到了 TestNG 的 DataProvider 选项,但它们并没有完全满足我的要求。我想对我的 MyBatis 映射器运行一些非常简单的测试,主要是为了确保我没有任何简单的语法错误、拼写错误等。现在,我有一个这样的基础测试类:
public class MapperTestBaseH2 {
protected SqlSessionManager sessionManager;
@BeforeClass
public void beforeClass() throws SQLException, LiquibaseUpdateException {
JdbcDataSource h2DataSource = new JdbcDataSource();
h2DataSource.setURL("jdbc:h2:mem:test-db;DB_CLOSE_DELAY=-1");
sessionManager = MyBatisUtils.createSqlSessionManager(h2DataSource);
LiquibaseUpdater.update(h2DataSource.getConnection(), LiquibaseUpdater.DEFAULT_CONTEXTS);
}
@BeforeMethod
public void beforeMethod() {
sessionManager.startManagedSession();
}
@AfterMethod
public void afterMethod() {
sessionManager.rollback();
}
}
然后我为每个映射器创建一个测试:
public class SequenceMapperTest extends MapperTestBaseH2 {
private SequenceMapper sequenceMapper;
@BeforeClass
@Override
public void beforeClass() throws SQLException, LiquibaseUpdateException {
super.beforeClass();
sequenceMapper = super.sessionManager.getMapper(SequenceMapper.class);
}
@Test
public void selectBidSequenceTest() {
sequenceMapper.selectSequence(Sequences.BID_SEQ);
}
@Test
public void updateBidSequenceTest() {
sequenceMapper.updateSequence(sequenceMapper.selectSequence(Sequences.BID_SEQ));
}
}
我想做的是运行每个测试类两次(或更多),每次使用不同的SqlSessionManager。我可以使用 TestNG 的 DataProvider 以多个 SqlSessionManagers 运行每个测试,但是我必须在每个测试中而不是在 @BeforeMethod 中启动和回滚会话。
有没有简单的方法来完成我想要的?
【问题讨论】:
-
你使用的是Spring之类的DI容器吗?
-
@AmirPashazadeh 不。我看了一点 Guice,但是,考虑到我正在做一些相当小的事情,它增加的复杂性比它消耗的要多得多。