繁体   English   中英

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

[英]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 */ }
  }
}

现在,测试AaAbAc只需要验证你的mDep被调用(除了方法之外)。 另外,您测试A.Dep.bA.Dep.c方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM