我正在尝试使用@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
有什么东西我不见了吗?或者我不知道的选项?
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")
}
}
mockito_kotlin
或mockito
扩展与SpyBean
合作mockito + CGLIB
CGLIB - 从您的日志感觉就像class com.blah.MyServiceImpl$$EnhancerBySpringCGLIB$$9712a2a5
一样,在您的服务实现之上有一个包装器,它是SpyBean
。这意味着CGLIB包装器不是,错误就是这样。尝试删除CGLIB包装器,它将工作