我试图使用@SpyBean
来模拟@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 包装的豆子:
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
,但被解析为与豆子相同 - 在
@BeforeEach
中使用Mockito.initAnnotations(this)
- 还有更多,我尝试了这么多我不记得的组合......
我错过了什么吗?还是我不知道的选项?
- 上述问题与协议或协议JVM库无关
- 问题不在于春天
- 弹簧 - 我将弹簧与 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")
}
}
Mockito -
mockito_kotlin
或mockito
扩展适用于SpyBean
问题是关于
mockito + CGLIB
- CGLIB - 从您的日志中感觉就像
class com.blah.MyServiceImpl$$EnhancerBySpringCGLIB$$9712a2a5
在您的服务实现之上有一个包装器,这是SpyBean
的。这意味着 CGLIB 包装器不是,错误就是为此。尝试删除 CGLIB 包装器,它将起作用
- CGLIB - 从您的日志中感觉就像