@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)
...

我试过:

有什么我想念的吗?或者我不知道的选项?

  1. 以上问题与 pact 或 pact JVM 库无关
  2. 问题与 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")
 }
}
  1. Mockito - mockito_kotlinmockito 扩展适用于 SpyBean

  2. 问题是关于 mockito + CGLIB

    • CGLIB - 从您的日志中感觉 class com.blah.MyServiceImpl$$EnhancerBySpringCGLIB$12a2a5 在您的服务实现之上有一个包装器 SpyBean。 这意味着 CGLIB 包装器不是,错误就是为此。 尝试删除 CGLIB 包装器,它将起作用