web-dev-qa-db-fra.com

Comment réinitialiser entre les tests

J'ai une classe de test 

@RunWith(SpringRunner.class)
@DataJpaTest

J'ai deux tests. Dans chaque test, je fais la même opération, persiste l'objet. Seuls les appels de recherche sont différents.

Si j'exécute les deux tests ensemble, ils échouent, mais si je lance test l'un après l'autre, ils réussissent.

Il n'y a pas de réinitialisation entre chaque test. Comment faire ça? Seul l'appel au référentiel est différent dans chaque test. 

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

}

Modifier

je mets tout le code: http://Pastebin.com/M9w9hEYQ

21
robert trudel

Ajoutez l'annotation @DirtiesContext en lui fournissant le AFTER_EACH_TEST_METHOD classMode

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

Dans votre cas, vous conservez les mêmes données pour chaque test. Vous devez donc conserver les données avant tout test ou persister avant chaque test et les nettoyer après.

1. Persister avant tout test

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

Dans ce cas, @AfterClass est éventuellement

2. Persister avant chaque test et nettoyer après chaque test

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

Rappelez-vous que les méthodes qui utilisent @BeforeClass et @AfterClass doivent être statiques.

10
marok

Vous pouvez utiliser l'annotation @DirtiesContext sur votre classe de test pour réinitialiser les tests. Vous pouvez également choisir le moment de la réinitialisation. La valeur par défaut est après chaque méthode, mais vous pouvez changer cela en transmettant différents paramètres à l'annotation @DirtiesContext.

import org.springframework.test.annotation.DirtiesContext;

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

Utilisez @Sql avec ExecutionPhase.AFTER_TEST_METHOD et transmettez le script à utiliser pour nettoyer la base de données. 

@Sql(scripts="classpath:cleanup.sql",executionPhase=Sql.ExecutionPhase.AFTER_TEST_METHOD)
@Test
public void whateverIsYourTestMethod()
{
...
}

Si vous utilisez l'annotation @Transactional, vous pouvez utiliser:

@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

Avez-vous essayé de vider le cache de péristence entre chaque test, conformément à TestEntityManager # clear ()

@After
public void clear() {
    this.entityManager.clear();
}

Ou essayez peut-être de définir votre Visitor en tant que champs et de les supprimer ultérieurement, puis de vider les modifications:

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) fonctionne pour moi, mais cela n’est nécessaire que lorsque j’exécute @DataJpaTest() avec @AutoConfigureTestDatabase(replace=Replace.NONE) et le profil costum pour mysql, h2 par défaut fonctionne sans cela.

0
kle pra