Java 如何验证方法是否在被测系统上被调用(不是模拟)

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

我正在尝试编写一个单元测试,需要确认是否调用了一个方法。我正在使用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”); 我想做的是不可能的吗?还是我只是走错了路


谢谢大家:)

我不确定你想做的是不是最好的方法

我不想验证
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 */ }
  }
}