spring - 使用 springmockk 时 Kotlintest 不执行测试
问题描述
我试图为我的 kotlin spring 应用程序编写一个集成测试。为此,我正在使用 kotlintest 框架。由于我需要在我的应用程序中模拟其中一个 bean,我还添加了带有 springmockk 扩展的 mockk。添加 springmockk 扩展后,测试不再执行。
我注意到一旦将 springmockk 添加到 gradle testImplement 依赖项中就会发生这种情况,甚至不必在应用程序代码本身中导入它。
buildscript {
ext.kotlin_version = '1.3.21'
ext.kotlintestVersion='3.4.2'
ext.spring_boot_version='2.1.4.RELEASE'
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:$springBoot_version")
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath("org.jetbrains.kotlin:kotlin-allopen:$kotlin_version")
}
}
...
dependencies {
...
testImplementation("org.springframework.boot:spring-boot-starter-test:$springBoot_version") {
testImplementation("io.kotlintest:kotlintest-runner-junit5:$kotlintestVersion")
testImplementation("io.kotlintest:kotlintest-extensions-spring:$kotlintestVersion")
testImplementation("io.mockk:mockk:1.9.3")
// testImplementation("com.ninja-squad:springmockk:2.0.0")
}
在 github 上,我发现了一个问题,遗憾的是已经关闭,没有任何适当的方式将这两个框架一起使用:https ://github.com/Ninja-Squad/springmockk/issues/26
编辑:
这是一个示例测试,在使用 mockkito 时有效,但在使用 springmockk 时无效。
@ExtendWith(SpringExtension::class)
@SpringBootTest
@AutoConfigureMockMvc
@WithMockUser(authorities = ["ROLE_TESTUSER"])
internal class MockTest : AnnotationSpec() {
override fun listeners() = listOf(SpringListener)
@Autowired
lateinit var mockMvc: MockMvc
@MockkBean
lateinit var securityHelper: SecurityHelper
@Test
fun integrationTest() {
whenever(securityHelper.someFunction()).thenReturn("test")
mockMvc.perform(MockMvcRequestBuilders.get("/some/endpoint")
).andExpect(MockMvcResultMatchers.status().isOk)
}
}
./gradlew test --rerun-tasks
输出:
> Configure project :
Property 'app.env' not found using profile dev: use -Papp.env=dev to define the environment for 'SPRING_PROFILES_ACTIVE'
> Task :compileKotlin
BUILD SUCCESSFUL in 56s
5 actionable tasks: 5 executed
解决方案
模拟豆与 springMockk
要使用@MockkBean
,您需要添加springmockk并从 gradle 文件中的 spring-boot-starter-test 中删除 mockito 核心,例如:
testImplementation("io.mockk:mockk:1.9.3")
testImplementation("com.ninja-squad:springmockk:2.0.2")
testImplementation("org.springframework.boot:spring-boot-starter-test") {
exclude(module = "mockito-core")
}
然后你的bean应该被嘲笑:
@MockkBean
lateinit var securityHelper: SecurityHelper
仅带 MockK 的模拟豆
@TestConfiguration
您可以通过修改模拟 Bean 的配置文件并将其设置为与用于测试的配置文件相同来使用 mockK模拟 bean:
@TestConfiguration
class ControllerTestConfig {
@Bean
@Profile("test")
fun securityHelper(): SecurityHelper {
val securityHelperMock: SecurityHelper = mockk(relaxed = true)
every { securityHelperMock.someFunction() } returns "test"
return securityHelperMock
}
}
您可以强制使用 TestConfig,方法是将其放入您的@SpringBootTest
:
@SpringBootTest(
classes = [YourApplication::class, ControllerTestConfig::class]
)
推荐阅读
- audio - 带有书签的 asp.net 核心音频播放列表
- node.js - 如何在代码中解析图像路径时捆绑图像?
- vb.net - 触发但未听到的声明事件
- google-bigquery - bigquery 代码未正确翻译 Guillemets « 和 »
- c++ - 指向在参数中创建的对象的指针
- javascript - 为什么我的黑暗模式不能完全工作?而某些区域正在工作
- python - 将图像添加到 PDF
- javascript - 如何制作单击按钮时显示的加载动画?它应该占据全屏并且应该从右到左并消失
- c# - SqlConnection 错误 - 超时已过期。在从池中获取连接之前经过的超时时间
- android - Android Studio LLDB 调试