web-dev-qa-db-ja.com

テスト間でリセットする方法

テストクラスがあります

@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

26
robert trudel

@DirtiesContextアノテーションを追加しますが、AFTER_EACH_TEST_METHOD classModeで提供します

@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
19
HPacquee

各テストの場合、同じデータを保持します。そのため、すべてのテストの前にデータを保持するか、各テストの前にデータを保持してから、クリーンアップする必要があります。

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を使用するメソッドは静的でなければならないことに注意してください。

10
marok

テストクラスで@DirtiesContextアノテーションを使用してテストをリセットできます。また、リセットするタイミングを選択することもできます。デフォルトはすべてのメソッドの後にありますが、異なるパラメーターを@DirtiesContextアノテーションに渡すことで変更できます。

import org.springframework.test.annotation.DirtiesContext;

@RunWith(SpringRunner.class)
@DataJpaTest
@DirtiesContext
public class VisitRepositoryTest {
7
nesohc

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(){...}
3
Ruchi Saini

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();
}
3
Xephi

_@DirtiesContext(classMode =DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD_)が機能しますが、mysqlの@DataJpaTest()とcostumプロファイルで@AutoConfigureTestDatabase(replace=Replace.NONE)を実行する場合にのみ必要です。デフォルトのh2はこれなしで機能します。

0
kle pra