私の単体テストでは、次のようなURLを使用するいくつかのデータソースを自動配線しました
jdbc:derby:memory:mydb;create=true
インメモリDBを作成します。
インメモリDerbydbをドロップするには、以下に接続する必要があります。
jdbc:derby:memory:mydb;drop=true
私はこれがすべてのテストの後に起こり、新しいデータベースから始めたいと思います。Springを使用してこれを行うにはどうすればよいですか?
私の単体テストでは、次のようなURLを使用するいくつかのデータソースを自動配線しました
jdbc:derby:memory:mydb;create=true
インメモリDBを作成します。
インメモリDerbydbをドロップするには、以下に接続する必要があります。
jdbc:derby:memory:mydb;drop=true
私はこれがすべてのテストの後に起こり、新しいデータベースから始めたいと思います。Springを使用してこれを行うにはどうすればよいですか?
Derbyインメモリデータベースを適切にシャットダウンする方法
私に解決策のヒントを与えました:
mydb.drop.url = jdbc:derby:memory:mydb;drop=true
...
<bean id="mydbDropUrl" class="java.lang.String">
<constructor-arg value="${mydb.drop.url}" />
</bean>
...
@Resource
private String mydbDropUrl;
@After
public void tearDown() {
try {
DriverManager.getConnection(mydbDropUrl);
} catch (SQLException e) {
// ignore
}
}
欠点は、String(不変のStringオブジェクトの周りの不変のStringオブジェクト)を受け入れるStringコンストラクターを使用することです。Spring 3に@Valueアノテーションがあることを読みました。これはここで役立つかもしれませんが、Spring2.5を使用しています。
より良い解決策があれば教えてください。
SpringをHibernateと一緒に使用している場合は、データベースに依存しない方法でこれを行うことができます。
すべてのテストメソッドの前/後に、アプリケーションコンテキストが作成/破棄されることを確認してください。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath*:application-context-test.xml"})
@TestExecutionListeners({DirtiesContextTestExecutionListener.class,
DependencyInjectionTestExecutionListener.class})
@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)
public abstract class AbstractTest {
}
起動時にスキーマを自動作成し、シャットダウン時にスキーマを削除するようにHibernateに指示します。
hibernate.hbm2ddl.auto = create-drop
今、すべてのテストの前に
そしてすべてのテストの後
トランザクションを使用している場合は、を追加することをお勧めしますTransactionalTestExecutionListener
。
春のテスト3の後、アノテーションを使用して構成を挿入できます。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/spring-test.xml")
public class MyTest {
}
spring-test.jarライブラリを使用する場合は、次のように実行できます。
public class MyDataSourceSpringTest extends
AbstractTransactionalDataSourceSpringContextTests {
@Override
protected String[] getConfigLocations() {
return new String[]{"classpath:test-context.xml"};
}
@Override
protected void onSetUpInTransaction() throws Exception {
super.deleteFromTables(new String[]{"myTable"});
super.executeSqlScript("file:db/load_data.sql", true);
}
}
そして、最新のコメントに基づいて更新されたバージョンで、すべてのテストの前にdbを削除し、テーブルを再作成します。
public class MyDataSourceSpringTest extends
AbstractTransactionalDataSourceSpringContextTests {
@Override
protected String[] getConfigLocations() {
return new String[]{"classpath:test-context.xml"};
}
@Override
protected void onSetUpInTransaction() throws Exception {
super.executeSqlScript("file:db/recreate_tables.sql", true);
}
}
次のようなことをしてください。
public class DatabaseTest implements ApplicationContextAware {
private ApplicationContext context;
private DataSource source;
public void setApplicationContext(ApplicationContext applicationContext) {
this.context = applicationContext;
}
@Before
public void before() {
source = (DataSource) dataSource.getBean("dataSource", DataSource.class);
}
@After
public void after() {
source = null;
}
}
Beanにプロトタイプのスコープを持たせます(scope="prototype"
)。これにより、すべてのテストの前にデータソースの新しいインスタンスが取得されます。
これは、すべてのテストの開始時に行うことです。
以前のオブジェクトをすべて削除します。
create_table.sqlに記載されているすべてのテーブルを作成します
テストする内容に基づいて、作成したテーブルに値を挿入します。
@Before
public void initialInMemoryDatabase() throws IOException, FileNotFoundException {
inMemoryDerbyDatabase.dropAllObjects();
inMemoryDerbyDatabase.executeSqlFile("/create_table_policy_version_manager.sql");
inMemoryDerbyDatabase.executeSqlFile("/insert_table_policy_version_manager.sql");
}
チャームのように機能します!