我有一些业务逻辑类:
public class SomeService { public void doFirst() {} public void doSecond() { doFirst(); } }
并测试它:
public class SomeServiceTest { private SomeService service; @Before public void setUp() { service = new SomeService(); } @Test public void doSecond_someCondition_shouldCallFirst() { // given ... // when service.doSecond(); //then how to verify doFirst() was called? } }
如何验证doFirst()不是在模拟上调用,而是在实际服务中调用?
我想知道你为什么要测试,你的测试方法调用什么方法.听起来很像白盒测试对我来说.
在我看来,你想要验证调用的结果而不是到达那里的方式,因为这可能很容易改变(即重构时).
因此,如果doSecond()的结果与doFirst()相同,则可以为doFirst()编写测试并使用相同的测试(即断言集)来测试doSecond().
但是如果你真的想测试,doSeirst()是否已被doSecond()调用,你可以将你的服务包装在间谍中,然后在间谍上调用验证:
//given SomeService service = new SomeService(); SomeService spy = Mockito.spy(service); //when spy.doSecond(); //then verify(spy).doFirst();