如何在spring @Service测试中正确使用Mockito的验证

时间:2019-06-19 19:28:54

标签: kotlin mockito spring-test

我有这项服务(全部在科特林):

@Service
class MyService {

  fun getSomeString(): String = "test"
}

这个集成测试类:

@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.

实际上,对我来说这是有道理的,因为没有调用我的模拟程序,但是我在应用程序上的真正服务是

是否可以计算真实对象中的方法调用?

2 个答案:

答案 0 :(得分:0)

[由于没有回复而在此处发表评论]您是否尝试过使用@Spy?然后,您可以指定要模拟的方法和要调用的方法。我以为你也可以在间谍上应用Mockito.verify ...

答案 1 :(得分:0)

您可以spy on the real object像这样对方法调用进行计数:

@Test
fun `test method count`() {
    Mockito.spy(someObjectRelatedToMyService)
    verify(someObjectRelatedToMyService, atLeast(1)).getSome()
}

如您所见,您唯一要做的就是调用spy方法,该方法可以跟踪与目标对象的交互。

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