Java 如何验证方法是否在被测系统上被调用(不是模拟)
我正在尝试编写一个单元测试,需要确认是否调用了一个方法。我正在使用JUnit、Mockito和PowerMock public class Invoice { protected void createInvoice() { // random stuff here markInvoiceAsBilled("57"); } protected void markInvoiceAsBilled(String code) { // marked as billed } } 这个例子只是实际代码的一个例子 我的问题是mockito说您只能验证是否对模拟对象调用了方法。。。但我不想模拟这个对象,因为它是我的测试对象。我知道你可以监视你正在测试的对象,所以下面是我尝试的: verify(sutSpy).markInvoiceAsBilled("57"); 验证(sutSpy)。标记发票已开票(“57”); 我想做的是不可能的吗?还是我只是走错了路Java 如何验证方法是否在被测系统上被调用(不是模拟),java,junit,mocking,powermock,Java,Junit,Mocking,Powermock,我正在尝试编写一个单元测试,需要确认是否调用了一个方法。我正在使用JUnit、Mockito和PowerMock public class Invoice { protected void createInvoice() { // random stuff here markInvoiceAsBilled("57"); } protected void markInvoiceAsBilled(String code) { // marked as
谢谢大家:)我不确定你想做的是不是最好的方法 我不想验证
Invoice.createInvoice()
是否调用内部私有方法markInvoiceAsBilled()
-而是测试调用createInvoice()
是否以您期望的方式更改发票对象的状态-即。,该状态
现在是账单
或类似的东西
换句话说-不要测试
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是直截了当的,但覆盖a似乎是一件麻烦事,因为您依赖于方法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 */ }
}
}
现在,测试A.A
、A.b
和A.c
只需要验证调用了mDep
(以及该方法所做的其他操作)。分别测试A.Dep.b
和A.Dep.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 */ }
}
}