我正在尝试编写一个单元测试,需要确认是否调用了方法。我正在使用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");
我想做的不可能吗?或者我只是以错误的方式去做?
谢谢大家:)
答案 0 :(得分:0)
我同意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,覆盖a看起来很麻烦。
考虑这个设计
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 */ }
}
}
现在,测试A.a
,A.b
和A.c
只需要验证您的mDep
是否被调用(该方法除外)。另外,您可以测试A.Dep.b
和A.Dep.c
方法。