2

我正在尝试使用@SpyBean来模拟 a 的方法@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 包装的 bean:

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,但解决了上面相同的 bean
  • Mockito.initAnnotations(this)在一个使用@BeforeEach
  • 还有更多,我尝试了很多我不记得的组合......

有什么我想念的吗?还是我不知道的选项?

4

1 回答 1

1
  1. 上述问题与 pact 或 pact JVM 库无关
  2. 问题不在于春天
    • 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$$9712a2a5在您的服务实现之上有一个包装器,即SpyBean. 这意味着 CGLIB 包装器不是,错误是针对此的。尝试删除 CGLIB 包装器,它会工作
于 2019-03-31T21:18:58.843 回答