カスタムランナーなしでは要求していることを完全に実行することはできませんが、@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) {
...
}
});
}
...
}