gpt4 book ai didi

java - 是否可以在没有 @DirtiesContext 的情况下测试 Spring REST Controller ?

转载 作者:行者123 更新时间:2023-11-28 20:19:52 25 4
gpt4 key购买 nike

我正在开发一个 Spring-Boot 网络应用程序。编写集成测试的通常方式是:

@Test
@Transactional
@Rollback(true)
public void myTest() {
// ...
}

只要只有一个线程 就可以很好地工作。如果有多个线程,@Rollback 将无法工作。

但是,当使用 Spring REST 模板测试 @RestController 类时,总是多个线程(按设计):

  • 作为客户端运行REST模板的测试线程
  • 接收和处理请求的服务器线程

所以你不能在 REST 测试中使用 @Rollback。问题是:您使用什么来使测试可重复并让它们在测试套件中很好地发挥作用?

@DirtiesContext 有效,但这是一个糟糕的选择,因为在每个 REST 测试方法之后重新启动 Spring 应用程序上下文会使套件执行起来非常缓慢;每个测试都需要几毫秒才能运行,但重新启动上下文需要几秒钟。

最佳答案

首先,使用 Spring 上下文测试 Controller 不是单元测试。您应该考虑通过对依赖项使用模拟并创建 standalone mock MVC 来为 Controller 编写单元测试。 :

public class MyControllerTest {
@InjectMocks
private MyController tested;
// add @Mock annotated members for all dependencies used by the controller here
private MockMvc mvc;

// add your tests here using mvc.perform()
@Test
public void getHealthReturnsStatusAsJson() throws Exception {
mvc.perform(get("/health"))
.andExpect(status().isOk())
.andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON))
.andExpect(jsonPath("$.status", is("OK")));
}

@Before
public void createControllerWithMocks() {
MockitoAnnotations.initMocks(this);
MockMvcBuilders.standaloneSetup(controller).build()
}
}

如果您使用外部 @ControllerAdvice 进行错误处理等,只需在 MVC 构建器上调用 setControllerAdvice(),这甚至可以工作。

这样的测试并行运行没有问题,而且速度更快,因为根本不需要设置 Spring 上下文。

您描述的部分集成测试对于确保使用正确的接线以及所有测试单元按预期协同工作也很有用。但我更愿意进行更一般的集成测试,包括检查它们是否正常工作的多个/所有端点(不检查边缘情况)和仅模拟服务延伸到外部(如内部 REST 客户端,用内存中的数据库替换数据库) ,...)。使用此设置,您可以从一个新的数据库开始,甚至可能不需要回滚任何事务。这当然是使用像 Liquibase 这样的数据库迁移框架最舒服的。这将即时设置您的内存数据库。

关于java - 是否可以在没有 @DirtiesContext 的情况下测试 Spring REST Controller ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47809038/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com