ここで重要なものが欠けているようですが、自分で見つけることができませんでした。
いくつかの統合テストでテストしようとしている Hibernate と一緒に Spring Boot アプリがあります。テスト中にHSQLデータベースを使用しています。私が実行しようとしているテストでは、MockMvc を使用して、コントローラーが返す json 応答を確認します。
@Before と @After を使用してテスト データを初期化し、後で削除する構成クラスをテスト クラスに拡張させます。
したがって、私の 1 つのテスト クラスには 4 つのテストがあります。リストや単一のオブジェクトを返すなど、単純で基本的なことを行うだけです。それらはすべてデータを読み取っているだけです。
@Test
public void testGetSingleData() throws Exception {
this.mockMvc.perform(get("/api/data/{id}", 1)
.andExpect(status().isOk());
}
@Test
public void testGetListData() throws Exception {
this.mockMvc.perform(get("/api/data/", 1)
.andExpect(status().isOk());
}
…
and so on.
たまたま、これらのテストを個別に、つまり一度に 1 つずつ実行すると、すべて正常に動作します。期待される出力が得られます。ただし、4 つのテストを一緒に実行すると、そのうちの 1 つが同じ応答を返しません。実際、何も返していません。より具体的には、testGetSingleData テストは、単独で実行するとオブジェクトを返します。他のテストと一緒に実行すると、何も返されません。私のコントローラーは、データがデータベースにないと言います。テストの合間にデータベースで何かが起こっているようです。もちろんデータは初期化して落としますが、それでいいはずです。たとえば、オブジェクトのリストを返す 2 つのテストを一緒に実行すると問題なく動作しますが、単一のオブジェクトを返すテストと一緒に実行するとうまくいきません。そのため、testGetSingleData の実行時にデータが何らかの形で失われています。なぜこれが起こっているのか、潜在的な理由が必要だと思います。単独で動作するテストが他のテストと一緒に実行しているときに機能しないエラーの原因は何ですか?
私のクラス «test-config-class» には次の注釈が付けられています。
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(loader = SpringockitoAnnotatedWebContextLoader.class, classes = Application.class)
@TestPropertySource(locations = "classpath:config/application.properties")
編集:
@Autowired
private EntityManagerFactory firstDbEntityManager;
@Autowired
private EntityManagerFactory secondDbEntityManager;
protected SessionFactory firstDbSessionFactory;
protected SessionFactory secondDbSessionFactory;
@Before
public void initSessionFactories() {
if (firstDbSessionFactory == null) {
firstDbSessionFactory = firstDbEntityManager.unwrap(SessionFactory.class);
}
if (secondDbSessionFactory == null) {
secondDbSessionFactory = secondDbEntityManager.unwrap(SessionFactory.class);
}
initTestData();
}
@After
public void cleanDatabase() {
doCleanDatabase(firstDbEntityManager);
doCleanDatabase(secondDbEntityManager);
}
private void doCleanDatabase(EntityManagerFactory entityManagerFactory) {
Session session = entityManagerFactory.unwrap(SessionFactory.class).openSession();
session.createSQLQuery("truncate schema public and commit").executeUpdate();
session.flush();
session.close();
}