是否可以使用 Mockito 验证测试的对象方法调用?
Is it possible to verify tested object method call with Mockito?
我有一些业务逻辑class:
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() 不是在模拟上调用的,而是在真实服务上调用的?
听起来您想避免在测试中调用真正的 doFirst?如果是这样,试试这个...
//given
boolean firstCalled = false;
SomeService fakeService = new SomeService {
@Override
public void doFirst() {
firstCalled = true;
}
}
//when
fakeService.doSecond();
// then
assertTrue(firstCalled);
由于显而易见的原因,这种 testing/mocking 技术被称为 'subclass and override'。
我想知道你为什么要测试,你的测试方法调用了什么方法。对我来说听起来很像白盒测试。
在我看来,您想验证调用的结果而不是到达那里的方式,因为这可能很容易改变(即重构时)。
因此,如果 doSecond() 的结果与 doFirst() 相同,您可以为 doFirst() 编写测试并使用相同的测试(即断言集)来测试 doSecond()。
但是如果你真的想测试,doFirst() 是否被 doSecond() 调用,你可以将你的服务包装在一个 spy 中,然后在 spy 上调用验证:
//given
SomeService service = new SomeService();
SomeService spy = Mockito.spy(service);
//when
spy.doSecond();
//then
verify(spy).doFirst();
我有一些业务逻辑class:
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() 不是在模拟上调用的,而是在真实服务上调用的?
听起来您想避免在测试中调用真正的 doFirst?如果是这样,试试这个...
//given
boolean firstCalled = false;
SomeService fakeService = new SomeService {
@Override
public void doFirst() {
firstCalled = true;
}
}
//when
fakeService.doSecond();
// then
assertTrue(firstCalled);
由于显而易见的原因,这种 testing/mocking 技术被称为 'subclass and override'。
我想知道你为什么要测试,你的测试方法调用了什么方法。对我来说听起来很像白盒测试。
在我看来,您想验证调用的结果而不是到达那里的方式,因为这可能很容易改变(即重构时)。
因此,如果 doSecond() 的结果与 doFirst() 相同,您可以为 doFirst() 编写测试并使用相同的测试(即断言集)来测试 doSecond()。
但是如果你真的想测试,doFirst() 是否被 doSecond() 调用,你可以将你的服务包装在一个 spy 中,然后在 spy 上调用验证:
//given
SomeService service = new SomeService();
SomeService spy = Mockito.spy(service);
//when
spy.doSecond();
//then
verify(spy).doFirst();