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

时间:2012-09-14 17:18:43

标签: 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 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");

我想做的不可能吗?或者我只是以错误的方式去做?

谢谢大家:)

1 个答案:

答案 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.aA.bA.c只需要验证您的mDep是否被调用(该方法除外)。另外,您可以测试A.Dep.bA.Dep.c方法。