@SpyBean 不适用于 Pact 和 JUnit 5
@SpyBean not working with Pact and JUnit 5
我正在尝试使用 @SpyBean
来模拟 @Component
的方法但不起作用。 @MockBean
有效(在 example 之后)。我已经尝试、阅读和研究了很多方法,但无法实现。
示例如下:
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment. DEFINED_PORT)
@ExtendWith(SpringExtension::class)
@Provider("MyMicroService")
@PactFolder("../../../pacts")
internal class ClientContracts {
@SpyBean
private lateinit var myService: MyService
@TestTemplate
@ExtendWith(PactVerificationInvocationContextProvider::class)
fun pactVerificationTestTemplate(context: PactVerificationContext) {
context.verifyInteraction()
}
@State("default", "NO_DATA")
fun toDefaultState() {
reset(processService)
}
}
(我超级简化了测试函数,所以它更容易阅读,我实际上是在做 doReturn(...).when(...).blah()
)
我总是收到 "not a mock" 错误,因为对象总是被 Spring CGLIB 包装的 bean:
org.mockito.exceptions.misusing.NotAMockException: Argument should be a mock, but is: class com.blah.MyServiceImpl$$EnhancerBySpringCGLIB$12a2a5
at com.nhaarman.mockitokotlin2.MockitoKt.reset(Mockito.kt:36)
...
我试过:
- 和
@SpringJUnitConfig
- 使用单独的
@TestConfiguration
,但已解决为与上述 bean 相同
- 在
@BeforeEach
中使用 Mockito.initAnnotations(this)
- 还有更多,我尝试了很多我记不住的组合...
有什么我想念的吗?或者我不知道的选项?
- 以上问题与 pact 或 pact JVM 库无关
- 问题与 spring 无关
- Spring - 我将 spring 与 mockito 一起使用并且有效,简单的示例是:
import com.nhaarman.mockito_kotlin.doReturn
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.ExtendWith
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.boot.test.mock.mockito.SpyBean
import org.springframework.test.context.junit.jupiter.SpringExtension
@ExtendWith(value = [SpringExtension::class])
@SpringBootTest(
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
classes = [Application::class]
)
internal class processorIntegrationTest : IntegrationTest() {
@SpyBean
// @MockBean
private lateinit var processor: Processor;
@Test
internal fun abcd() {
doReturn("something").`when`(processor).get()
val get = processor.get()
assertThat(get).isEqualTo("something")
}
}
Mockito - mockito_kotlin
或 mockito
扩展适用于 SpyBean
问题是关于 mockito + CGLIB
- CGLIB - 从您的日志中感觉
class com.blah.MyServiceImpl$$EnhancerBySpringCGLIB$12a2a5
在您的服务实现之上有一个包装器 SpyBean
。
这意味着 CGLIB 包装器不是,错误就是为此。
尝试删除 CGLIB 包装器,它将起作用
我正在尝试使用 @SpyBean
来模拟 @Component
的方法但不起作用。 @MockBean
有效(在 example 之后)。我已经尝试、阅读和研究了很多方法,但无法实现。
示例如下:
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment. DEFINED_PORT)
@ExtendWith(SpringExtension::class)
@Provider("MyMicroService")
@PactFolder("../../../pacts")
internal class ClientContracts {
@SpyBean
private lateinit var myService: MyService
@TestTemplate
@ExtendWith(PactVerificationInvocationContextProvider::class)
fun pactVerificationTestTemplate(context: PactVerificationContext) {
context.verifyInteraction()
}
@State("default", "NO_DATA")
fun toDefaultState() {
reset(processService)
}
}
(我超级简化了测试函数,所以它更容易阅读,我实际上是在做 doReturn(...).when(...).blah()
)
我总是收到 "not a mock" 错误,因为对象总是被 Spring CGLIB 包装的 bean:
org.mockito.exceptions.misusing.NotAMockException: Argument should be a mock, but is: class com.blah.MyServiceImpl$$EnhancerBySpringCGLIB$12a2a5
at com.nhaarman.mockitokotlin2.MockitoKt.reset(Mockito.kt:36)
...
我试过:
- 和
@SpringJUnitConfig
- 使用单独的
@TestConfiguration
,但已解决为与上述 bean 相同 - 在
@BeforeEach
中使用 - 还有更多,我尝试了很多我记不住的组合...
Mockito.initAnnotations(this)
有什么我想念的吗?或者我不知道的选项?
- 以上问题与 pact 或 pact JVM 库无关
- 问题与 spring 无关
- Spring - 我将 spring 与 mockito 一起使用并且有效,简单的示例是:
import com.nhaarman.mockito_kotlin.doReturn
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.ExtendWith
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.boot.test.mock.mockito.SpyBean
import org.springframework.test.context.junit.jupiter.SpringExtension
@ExtendWith(value = [SpringExtension::class])
@SpringBootTest(
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
classes = [Application::class]
)
internal class processorIntegrationTest : IntegrationTest() {
@SpyBean
// @MockBean
private lateinit var processor: Processor;
@Test
internal fun abcd() {
doReturn("something").`when`(processor).get()
val get = processor.get()
assertThat(get).isEqualTo("something")
}
}
Mockito -
mockito_kotlin
或mockito
扩展适用于SpyBean
问题是关于
mockito + CGLIB
- CGLIB - 从您的日志中感觉
class com.blah.MyServiceImpl$$EnhancerBySpringCGLIB$12a2a5
在您的服务实现之上有一个包装器SpyBean
。 这意味着 CGLIB 包装器不是,错误就是为此。 尝试删除 CGLIB 包装器,它将起作用
- CGLIB - 从您的日志中感觉