@SpyBean不能与 Pact 和 JUnit 5 一起使用



我试图使用@SpyBean来模拟@Component的方法,但不起作用。 @MockBean有效(遵循示例(。我尝试,阅读和研究了很多方法,但无法使其起作用。

下面是示例:

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

我总是收到"不是模拟"错误,因为对象始终是 Spring CGLIB 包装的豆子:

org.mockito.exceptions.misusing.NotAMockException: Argument should be a mock, but is: class com.blah.MyServiceImpl$$EnhancerBySpringCGLIB$$9712a2a5
    at com.nhaarman.mockitokotlin2.MockitoKt.reset(Mockito.kt:36)
...

我试过:

  • @SpringJUnitConfig
  • 用单独的@TestConfiguration,但被解析为与豆子相同
  • @BeforeEach中使用Mockito.initAnnotations(this)
  • 还有更多,我尝试了这么多我不记得的组合......

我错过了什么吗?还是我不知道的选项?

  1. 上述问题与协议或协议JVM库无关
  2. 问题不在于春天
    • 弹簧 - 我将弹簧与 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$$9712a2a5在您的服务实现之上有一个包装器,这是SpyBean的。这意味着 CGLIB 包装器不是,错误就是为此。尝试删除 CGLIB 包装器,它将起作用

最新更新