如何在测试之间重置
Posted
tags:
篇首语:本文由小常识网(cha138.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
添加@DirtiesContext注释,但为其提供AFTER_EACH_TEST_METHOD类模式
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
在每种测试的情况下,您都会保留相同的数据。因此,您应该在所有测试之前保留数据,或者在每次测试之前保留数据并在之后进行清理。
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的方法必须是静态的。
您可以在测试类上使用@DirtiesContext注释来重置测试,您也可以选择何时重置。默认值是在每个方法之后,但您可以通过将不同的参数传递给@DirtiesContext注释来更改它。
import org.springframework.test.annotation.DirtiesContext;
@RunWith(SpringRunner.class)
@DataJpaTest
@DirtiesContext
public class VisitRepositoryTest {
将@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(){...}
根据qazxsw poi,您是否尝试清除每次测试之间的持久性缓存
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();
}
)对我有用,但只有当我用@DirtiesContext(classMode =DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD
和costum profile for mysql运行@DataJpaTest()
时,默认h2才有效。
以上是关于如何在测试之间重置的主要内容,如果未能解决你的问题,请参考以下文章
使用 Testcontainers 和 Liquibase 时在测试之间重置数据库