如何在 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 方法,该方法可以跟踪与目标对象的交互。

在验证方法之前添加此调用时,您应该不会再收到对象不是模拟的错误。