it-roy-ru.com

Как выполнить сброс между тестами

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

@RunWith(SpringRunner.class)
@DataJpaTest

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

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

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

@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

21
robert trudel

Добавьте аннотацию @DirtiesContext, но предоставьте ей AFTER_EACH_TEST_METHOD classMode

@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
16
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

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

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

@DirtiesContext(classMode =DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) работает для меня, но это необходимо, только когда я запускаю @DataJpaTest() с @AutoConfigureTestDatabase(replace=Replace.NONE) и профилем costum для mysql, по умолчанию h2 работает без этого.

0
kle pra