如何在测试之间重置

问题描述 投票:22回答:6

我有一个测试课

@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

java spring spring-boot spring-data-jpa junit4
6个回答
17
投票

添加@DirtiesContext注释,但为其提供AFTER_EACH_TEST_METHOD类模式

@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)

10
投票

在每种测试的情况下,您都会保留相同的数据。因此,您应该在所有测试之前保留数据,或者在每次测试之前保留数据并在之后进行清理。

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的方法必须是静态的。


7
投票

您可以在测试类上使用@DirtiesContext注释来重置测试,您也可以选择何时重置。默认值是在每个方法之后,但您可以通过将不同的参数传递给@DirtiesContext注释来更改它。

import org.springframework.test.annotation.DirtiesContext;

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

3
投票

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

2
投票

根据qazxsw poi,您是否尝试清除每次测试之间的持久性缓存

TestEntityManager#clear()

或者尝试将@After public void clear() { this.entityManager.clear(); } 设置为字段并在之后删除它们,而不是刷新更改:

Visitor

0
投票

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(); } )对我有用,但只有当我用@DirtiesContext(classMode =DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD和costum profile for mysql运行@DataJpaTest()时,默认h2才有效。

© www.soinside.com 2019 - 2024. All rights reserved.