【发布时间】:2020-02-10 21:26:07
【问题描述】:
我对 Spring Boot 提供的测试功能和实用程序有点困惑。
我在我的项目中使用spring-boot-starter-test,我想在没有数据库连接的情况下对我的服务进行单元测试
目前我将@WebMvcTest 用于控制器测试套件,将@SpringBootTest 用于所有其他测试类。
但我在某处读到 @SpringBootTest 仅用于集成测试...
阅读documentation 我不明白建议的服务方法是什么。我应该只在与 repos 的集成中测试它们吗?
更新
这是我的一项服务的测试类的摘录:
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
@SpringBootTest
internal class SignupServiceTest(
@Autowired val signupService: SignupService
) {
@MockkBean
lateinit var userRepository: UserRepository
@Test
fun `should return exception if username already used`() {
every { userRepository.findByUsername("registered-user") } returns fakeUser(username = "registered-user")
assertThatThrownBy {
signupService.createNewAccount(fakeSignupForm(username = "registered-user"))
}.isExactlyInstanceOf(UsernameNotAvailableException::class.java)
}
// ... other tests
}
【问题讨论】:
-
不,您应该通过模拟 repo 层来测试各个服务类。是的,您不应该使用
@SpringbootTest,它将加载整个应用程序上下文,单元测试不需要这样做 -
这就是我想要做的(我正在使用 MockK),但仍然需要数据库连接...
-
没有必要。放上相关的代码,可能会更容易建议
-
@pvpkiran 我添加了一些代码
-
使用
@RunWith(MockitoJUnitRunner.class)代替springboottest,使用@Autowired和@MockBean代替@Mock和@InjectMocks
标签: spring-boot unit-testing kotlin