Как reset между тестами

У меня есть тестовый класс

@RunWith(SpringRunner.class)
@DataJpaTest

У меня два теста. В каждом тесте я выполняю ту же операцию, сохраняю объект. Только вызов на поиск отличается.

Если я запускаю оба теста вместе, они терпят неудачу, но если я запускаю тест один за другим, они будут успешными.

Между каждым тестом не существует reset. Как это сделать? Только вызов в репозитории отличается в каждом тесте.

@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"));

}

Изменить

i поместил весь код: http://pastebin.com/M9w9hEYQ

Ответ 1

В вашем случае для каждого теста вы сохраняете одни и те же данные. Таким образом, вы должны сохранять данные перед всеми тестами или сохраняться перед каждым тестом и чистить после него.

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, должны быть статическими.

Ответ 2

Вы можете использовать аннотацию @DirtiesContext в тестовом классе для reset тестов, там вы также можете выбрать, когда reset. По умолчанию используется каждый метод, но вы можете изменить его, передав разные параметры в аннотацию @DirtiesContext.

import org.springframework.test.annotation.DirtiesContext;

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

Ответ 3

Добавьте аннотацию @DirtiesContext, но укажите ее AFTER_EACH_TEST_METHOD classMode

@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)

Ответ 4

Пробовали ли вы очищать кеш непрерывности между каждым тестом, в соответствии с 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();
}

Ответ 5

Используйте @Sql с ExecutionPhase.AFTER_TEST_METHOD и передайте script, который будет использоваться для очистки базы данных

@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(){...}