我正在尝试使用@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
有什么我想念的吗?还是我不知道的选项?
答案 0 :(得分:0)
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-mockito_kotlin
或mockito
扩展名适用于SpyBean
问题大约是mockito + CGLIB
class com.blah.MyServiceImpl$$EnhancerBySpringCGLIB$$9712a2a5
在服务实现的顶部有一个包装SpyBean
。
这意味着不是CGLIB包装器,并且错误是出于此原因。
尝试删除CGLIB包装器,它将起作用