@SpyBean无法与Pact和JUnit 5一起使用

时间:2019-03-29 17:21:00

标签: spring-boot kotlin pact pact-jvm

我正在尝试使用@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模拟”错误,因为该对象始终是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
  • 还有更多,我尝试了很多我不记得的组合...

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

1 个答案:

答案 0 :(得分:0)

  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包装器,它将起作用