[英]How to verify if method is called on System under test (not a mock)
我正在尝试编写一个单元测试,需要确认是否调用了一个方法。 我正在使用JUnit,Mockito和PowerMock。
public class Invoice { protected void createInvoice() { // random stuff here markInvoiceAsBilled("57"); } protected void markInvoiceAsBilled(String code) { // marked as billed } }
所以,我的待测系统是Invoice
。 我正在运行这个测试:
public class InvoiceTest { @Test public void testInvoiceMarkedAsBilled() { Invoice sut = new Invoice(); Invoice sutSpy = spy(sut); sut.createInvoice(); // I want to verify that markInvoiceAsBilled() was called } }
这个例子只是一个实际代码看起来像的例子....
我的问题是mockito说你只能验证是否在模拟对象上调用了一个方法......但是我不想模拟这个对象,因为它是我测试的对象。 我知道你可以监视你正在测试的对象,所以这就是我试过的:
verify(sutSpy).markInvoiceAsBilled("57");
我想做的不可能吗? 或者我只是以错误的方式去做?
感谢大家 :)
我不确定你试图做的是最好的办法。
我不会关心验证Invoice.createInvoice()
调用内部私有方法markInvoiceAsBilled()
- 而是测试调用createInvoice()
以您期望的方式更改Invoice对象的状态 - 即,该status
现在是BILLED
或类似的东西。
换句话说 - 不要测试createInvoice()
调用哪些方法 - 测试在调用此方法后,对象的状态是您所期望的。
我同意matt-b的回答。 话虽如此,根据用例和方法的复杂性,您可以重新设计您的单元,以便进行测试。
比如说你的对象变得更加复杂,例如
public A {
public a() {
b();
c();
}
public b() { /** hairy code, many branches to test */ }
public c() { /** hairy code, many branches to test */ }
}
用测试覆盖b和用测试覆盖c是直截了当的,但是因为你依赖方法b和c,所以覆盖一个似乎很麻烦。
请考虑这种设计
public A {
private final Dep mDep;
public a() {
mDep.b();
mDep.c();
}
public b() {
mDep.b();
}
public c() {
mDep.c();
}
// dependency abstraction we create to help test
static class Dep {
public b() { /** hairy code, many branches to test */ }
public c() { /** hairy code, many branches to test */ }
}
}
现在,测试Aa
, Ab
和Ac
只需要验证你的mDep
被调用(除了方法之外)。 另外,您测试A.Dep.b
和A.Dep.c
方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.