テストクラスがあります
@RunWith(SpringRunner.class)
@DataJpaTest
2つのテストがあります。すべてのテストで同じ操作を行い、オブジェクトを永続化します。 find呼び出しのみが異なります。
両方のテストを一緒に実行すると失敗しますが、次々にテストを実行すると成功します。
各テストの間にリセットはありません。どうやってするか?リポジトリへの呼び出しのみが各テストで異なります。
@Test
public void findTopByCommerceCommerceIdOrderByEntryTimeDesc() {
Long commerceId = 1L;
Commerce commerce = new Commerce();
commerce.setName("test");
this.entityManager.persist(commerce);
Member member = new Member();
member.setCommerce(commerce);
member.setMan(true);
member.setName("bob binette");
this.entityManager.persist(member);
Visit visit1 = new Visit();
visit1.setCommerce(commerce);
visit1.setMember(member);
visit1.setEntryTime(LocalDateTime.of(LocalDate.now(), LocalTime.now()));
Visit visit2 = new Visit();
visit2.setCommerce(commerce);
visit2.setMember(member);
visit2.setEntryTime(LocalDateTime.of(LocalDate.now().minusDays(2), LocalTime.now()));
this.entityManager.persist(visit1);
this.entityManager.persist(visit2);
Visit visit = visitRepository.findTopByCommerceCommerceIdOrderByEntryTimeDesc(commerceId);
assertEquals(visit.getVisitId(), Long.valueOf("1"));
}
編集
私はすべてのコードを入れます: http://Pastebin.com/M9w9hEYQ
@DirtiesContextアノテーションを追加しますが、AFTER_EACH_TEST_METHOD classModeで提供します
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
各テストの場合、同じデータを保持します。そのため、すべてのテストの前にデータを保持するか、各テストの前にデータを保持してから、クリーンアップする必要があります。
1。すべてのテストの前に保持
@BeforeClass
public static void init(){
//persist your data
}
@AfterClass
public static void clear(){
//remove your data
}
@Test
public void findTopByCommerceCommerceIdOrderByEntryTimeDesc() {
Visit visit = visitRepository.findTopByCommerceCommerceIdOrderByEntryTimeDesc(commerceId);
assertEquals(visit.getVisitId(), Long.valueOf("1"));
}
この場合、@ AfterClassはオプションです
2。各テストの前に持続し、各テストの後にきれいにする
@Before
public void init(){
//persist your data
}
@After
public void clear(){
//remove your data
}
@Test
public void findTopByCommerceCommerceIdOrderByEntryTimeDesc() {
Visit visit = visitRepository.findTopByCommerceCommerceIdOrderByEntryTimeDesc(commerceId);
assertEquals(visit.getVisitId(), Long.valueOf("1"));
}
@BeforeClassと@AfterClassを使用するメソッドは静的でなければならないことに注意してください。
テストクラスで@DirtiesContextアノテーションを使用してテストをリセットできます。また、リセットするタイミングを選択することもできます。デフォルトはすべてのメソッドの後にありますが、異なるパラメーターを@DirtiesContextアノテーションに渡すことで変更できます。
import org.springframework.test.annotation.DirtiesContext;
@RunWith(SpringRunner.class)
@DataJpaTest
@DirtiesContext
public class VisitRepositoryTest {
ExecutionPhase.AFTER_TEST_METHODで@Sqlを使用し、データベースのクリーニングに使用されるスクリプトを渡します
@Sql(scripts="classpath:cleanup.sql",executionPhase=Sql.ExecutionPhase.AFTER_TEST_METHOD)
@Test
public void whateverIsYourTestMethod()
{
...
}
@Transactional注釈を使用している場合は、次を使用できます。
@Sql(scripts="classpath:cleanup.sql",executionPhase=Sql.ExecutionPhase.AFTER_TEST_METHOD,config = @SqlConfig
( transactionMode = TransactionMode.ISOLATED,
transactionManager = "transactionManager",
dataSource= "dataSource" ))
@Test
@Commit
@Transactional
public void whateverIsYourTestMethod(){...}
TestEntityManager#clear() に従って、各テスト間の永続性キャッシュをクリアしようとしましたか?
@After
public void clear() {
this.entityManager.clear();
}
または、Visitor
をフィールドとして設定し、変更をフラッシュするよりも後で削除することもできます。
Visit visit1;
Visit visit2;
@After
public void clear(){
if (visit1 != null)
this.entityManager.remove(visit1);
if (visit2 != null)
this.entityManager.remove(visit2);
this.entityManager.flush();
}
_@DirtiesContext(classMode =DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD
_)が機能しますが、mysqlの@DataJpaTest()
とcostumプロファイルで@AutoConfigureTestDatabase(replace=Replace.NONE)
を実行する場合にのみ必要です。デフォルトのh2はこれなしで機能します。