webentwicklung-frage-antwort-db.com.de

Zurücksetzen zwischen den Tests

Ich habe eine Testklasse 

@RunWith(SpringRunner.class)
@DataJpaTest

Ich habe zwei Tests. Bei jedem Test mache ich dieselbe Operation, beharrt das Objekt. Nur der Suchaufruf ist unterschiedlich.

Wenn ich beide Tests zusammen starte, schlagen sie fehl, aber wenn ich einen Test nach dem anderen starte, sind sie erfolgreich.

Zwischen jedem Test wird kein Reset durchgeführt. Wie geht das? Nur der Aufruf des Repositorys unterscheidet sich bei jedem 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"));

}

Bearbeiten

ich habe den gesamten Code: http://Pastebin.com/M9w9hEYQ

21
robert trudel

Fügen Sie die Annotation @DirtiesContext hinzu, geben Sie jedoch den AFTER_EACH_TEST_METHOD classMode an

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

In Ihrem Fall bleiben für jeden Test dieselben Daten erhalten. Daher sollten Sie die Daten vor allen Tests beibehalten oder vor jedem Test persistieren und danach reinigen.

1. Vor allen Tests bestehen bleiben

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

In diesem Fall ist @AfterClass optional

2. Vor jedem Test bestehen bleiben und nach jedem Test reinigen

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

Denken Sie daran, dass Methoden, die @BeforeClass und @AfterClass verwenden, statisch sein müssen.

10
marok

Sie können die Annotation @DirtiesContext für Ihre Testklasse verwenden, um die Tests zurückzusetzen. Dort können Sie auch auswählen, wann sie zurückgesetzt werden sollen. Standardwert ist nach jeder Methode. Sie können dies jedoch ändern, indem Sie verschiedene Parameter an die Annotation @DirtiesContext übergeben.

import org.springframework.test.annotation.DirtiesContext;

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

Verwenden Sie @Sql mit ExecutionPhase.AFTER_TEST_METHOD und übergeben Sie das Skript, das zum Bereinigen der Datenbank verwendet werden soll 

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

Falls Sie die @Transactional-Annotation verwenden, können Sie Folgendes verwenden:

@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

Haben Sie versucht, den Peristence-Cache zwischen den einzelnen Tests zu löschen, entsprechend TestEntityManager # clear ()

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

Oder versuchen Sie vielleicht, Ihre Visitor als Felder festzulegen und sie in einem Nachher zu entfernen, als die Änderungen zu löschen:

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) funktioniert für mich, aber es ist nur erforderlich, wenn ich @DataJpaTest() mit @AutoConfigureTestDatabase(replace=Replace.NONE) und costum profile für mysql ausführt.

0
kle pra