gpt4 book ai didi

Spring Boot 2.1/2.2 测试 - 如何在不为其他一切创建 bean 的情况下测试单个 Controller ?

转载 作者:行者123 更新时间:2023-11-28 21:35:47 28 4
gpt4 key购买 nike

在 Spring Boot 2.0 之前我有类似的东西:

@RunWith(SpringRunner::class)
@DataJpaTest
@AutoConfigureMockMvc
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@ActiveProfiles("unit-test")
@SpringBootTest
@WithUserDetails
class MyControllerTest {

@InjectMocks
lateinit var myController: MyController

lateinit var mvc: MockMvc

@Before
fun setup() {
mvc = MockMvcBuilders.standaloneSetup(myController).build()
}
...

但是在尝试升级到 Spring Boot 2.1 之后,我得到了各种随机错误,例如:

  1. WithUserDetails 不工作:java.lang.IllegalStateException: Unable to create SecurityContext using @org.springframework.security.test.context.support.WithUserDetails(value=user, userDetailsServiceBeanName=, setupBefore=TEST_METHOD)
  2. 正在(尝试)创建不相关的 bean:kotlin.UninitializedPropertyAccessException: lateinit property <property> has not been initialized - 这是来自 @ConfigurationProperties类。

还有一些对我来说没有意义的其他东西(在 2.2 中,我也不能同时拥有 @DataJpaTest@SpringBootTest)。

有人知道我需要做什么才能正确更新这些单元测试吗?

最佳答案

您可以使用切片测试 @WebMvcTest 或使用 @SpringBootTest 的完整集成测试。因此将它们一起使用是没有意义的。在您的情况下,您想测试一个 Controller ,然后使用 @WebMvcTest 并模拟依赖项。

@RunWith(SpringRunner::class)
@WebMvcTest(MyController.class)
@WithUserDetails
class MyControllerTest {

@Autowired
lateinit var myController: MyController

@Autowired
lateinit var mvc: MockMvc


@MockBean
var myService: MyServiceForController

使用@MockBean 模拟 Controller 的服务依赖并在其上注册行为。您现在还可以简单地连接 Controller 和预设置 MockMvc 实例,而不是自己连接。

关于Spring Boot 2.1/2.2 测试 - 如何在不为其他一切创建 bean 的情况下测试单个 Controller ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58943998/

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