@SpyBean不使用Pact和JUnit 5

问题描述 投票:0回答:1

我正在尝试使用@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()

我总是得到“非模拟”错误,因为该对象始终是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,但得到解决相同的上述豆
  • Mockito.initAnnotations(this)中使用@BeforeEach
  • 而且,我已经尝试过这么多组合,我记不起来了......

有什么东西我不见了吗?或者我不知道的选项?

spring-boot kotlin pact pact-jvm
1个回答
0
投票
  1. 上面的问题与pact或pact JVM库无关
  2. 问题不在于春天 Spring - 我使用带有mockito的spring并且它可以工作,简单的例子是:
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包装器,它将工作
© www.soinside.com 2019 - 2024. All rights reserved.