gpt4 book ai didi

spring - 使用 springmockk 时 Kotlintest 不执行测试

转载 作者:行者123 更新时间:2023-12-02 12:03:05 26 4
gpt4 key购买 nike

我试图为我的 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 模拟 Bean
使用 @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 应该被 mock :
@MockkBean
lateinit var securityHelper: SecurityHelper
仅使用 MockK 的 Mock Bean
您可以通过修改 @TestConfiguration 来使用 mockK 来模拟 bean。并将模拟 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]
)

关于spring - 使用 springmockk 时 Kotlintest 不执行测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59893918/

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