如何在 spring @Service 测试中正确使用 Mockito 的验证
How to correctly use Mockito's verify on a spring @Service test
我有这项服务(全部在 kotlin 中):
@Service
class MyService {
fun getSomeString(): String = "test"
}
而这个集成测试class:
@RunWith(SpringRunner::class)
@SpringBootTest
@EmbeddedKafka // used on some kafka tests
class BasicTests {
和方法:
@Test
fun `test method count`() {
// here I have a kafka producer sending a message to a topic that ends up
// calling myService.getSomeString via @KafkaListener from other services
verify(someObjectRelatedToMyService, atLeast(1)).getSome()
}
代替someObjectRelatedToMyService
我试着用
@Autowired
lateinit var myService: MyService
但后来我得到了Argument passed to verify() is of type MyService and is not a mock!
但是当我使用
@Mock
lateinit var myMock: MyService
我得到Actually, there were zero interactions with this mock.
实际上,对我来说这是有道理的,因为我的模拟没有被调用,但我在应用程序中的真正服务是。
是否可以计算来自我的真实对象的方法调用?
[由于没有代表发表评论而在此处发布]您是否尝试过使用@Spy?然后您可以指定模拟哪些方法以及调用哪些方法。我想你也可以对间谍应用 Mockito.verify...
您可以spy on the real object像这样计算对其的方法调用:
@Test
fun `test method count`() {
Mockito.spy(someObjectRelatedToMyService)
verify(someObjectRelatedToMyService, atLeast(1)).getSome()
}
如您所见,您唯一需要做的就是调用 spy 方法,该方法可以跟踪与目标对象的交互。
在验证方法之前添加此调用时,您应该不会再收到对象不是模拟的错误。
我有这项服务(全部在 kotlin 中):
@Service
class MyService {
fun getSomeString(): String = "test"
}
而这个集成测试class:
@RunWith(SpringRunner::class)
@SpringBootTest
@EmbeddedKafka // used on some kafka tests
class BasicTests {
和方法:
@Test
fun `test method count`() {
// here I have a kafka producer sending a message to a topic that ends up
// calling myService.getSomeString via @KafkaListener from other services
verify(someObjectRelatedToMyService, atLeast(1)).getSome()
}
代替someObjectRelatedToMyService
我试着用
@Autowired
lateinit var myService: MyService
但后来我得到了Argument passed to verify() is of type MyService and is not a mock!
但是当我使用
@Mock
lateinit var myMock: MyService
我得到Actually, there were zero interactions with this mock.
实际上,对我来说这是有道理的,因为我的模拟没有被调用,但我在应用程序中的真正服务是。
是否可以计算来自我的真实对象的方法调用?
[由于没有代表发表评论而在此处发布]您是否尝试过使用@Spy?然后您可以指定模拟哪些方法以及调用哪些方法。我想你也可以对间谍应用 Mockito.verify...
您可以spy on the real object像这样计算对其的方法调用:
@Test
fun `test method count`() {
Mockito.spy(someObjectRelatedToMyService)
verify(someObjectRelatedToMyService, atLeast(1)).getSome()
}
如您所见,您唯一需要做的就是调用 spy 方法,该方法可以跟踪与目标对象的交互。
在验证方法之前添加此调用时,您应该不会再收到对象不是模拟的错误。