【问题标题】:How to verify if method was called from other with same class by mockito如何通过mockito验证是否从其他具有相同类的方法调用
【发布时间】:2012-02-04 00:59:58
【问题描述】:

我想测试一些在同一个类中调用其他方法的方法。它们基本上是相同的方法,但具有不同数量的参数,因为数据库中有一些默认值。我在此展示

public class A{
    Integer quantity;
    Integer price;        

    A(Integer q, Integer v){
        this quantity = q;
        this.price = p;
    }

    public Float getPriceForOne(){
        return price/quantity;
    }

    public Float getPrice(int quantity){
        return getPriceForOne()*quantity;
    }
}

所以我想测试调用getPrice(int)方法时是否调用了getPriceForOne()方法。基本上像平常一样调用 getPrice(int) 并模拟 getPriceForOne。

import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
....

public class MyTests {
    A mockedA = createMockA();

    @Test
    public void getPriceTest(){
        A a = new A(3,15);
        ... test logic of method without mock ...

        mockedA.getPrice(2);
        verify(mockedA, times(1)).getPriceForOne();
    }
}

请记住,我有一个更复杂的文件,它是其他人的实用程序,它们必须都在一个文件中。

【问题讨论】:

  • 你想要的是部分模拟但不推荐,Mockito 实际上不鼓励这样做,但某些特定情况除外。如果它是一个实用程序类,那么完全测试每个方法是有意义的。如果不是,即它需要复杂的处理,您可能希望使用组合来设计您的代码。

标签: java mockito


【解决方案1】:

你需要一个间谍,而不是一个模拟 A:

    A a = Mockito.spy(new A(1,1));
    a.getPrice(2);
    verify(a, times(1)).getPriceForOne();

【讨论】:

  • 什么是 getPriceForOne 应该有一些任意参数?
  • 那么您只需将any(YourObject.class) 添加为getPriceForOne 的参数
  • 这样做是正确的。同时,如果你的 'spyed' 类有私有变量要设置,这些也需要使用 Whitebox.setInternalState() 方法设置为该类。
  • verify(a, times(1)),可以跳过第二个参数:是多余的。这样做会提高可读性和简洁性。请参阅Mockito.verify 的文档和实现:``` public static T verify(T mock) { return MOCKITO_CORE.verify(mock, ti​​mes(1)); } ```
  • 如果你想防止测试失败,你可以使用 try/catch,但是在你的测试中使用这样的逻辑通常不是一个好主意。您不需要条件,因为理想情况下,您的代码每次运行测试时都会以相同的方式工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-23
  • 1970-01-01
  • 2014-01-21
相关资源
最近更新 更多