Как 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(){...}