首页 >Java >java教程 >如何使用 Mockito 有选择地模拟 Java 中的方法?

如何使用 Mockito 有选择地模拟 Java 中的方法?

Linda Hamilton
Linda Hamilton原创
2024-12-07 18:34:13659浏览

How to Selectively Mock Methods in Java with Mockito?

使用 Mockito 模拟 Java 中的选择性方法

在 Java 中,Mockito 允许开发人员模拟类中的特定方法,同时保持其他方法不受影响。这个过程称为部分模拟。

考虑以下 Stock 类:

public class Stock {

    private final double price;
    private final int quantity;

    public Stock(double price, int quantity) {
        this.price = price;
        this.quantity = quantity;
    }

    public double getPrice() {
        return price;
    }

    public int getQuantity() {
        return quantity;
    }

    public double getValue() {
        return getPrice() * getQuantity();
    }
}

在测试场景中,我们可能想要模拟 getPrice() 和getQuantity() 方法返回特定值。然而,我们希望 getValue() 方法执行其预期的计算。

使用部分模拟,我们可以实现如下:

Stock stock = mock(Stock.class);
when(stock.getPrice()).thenReturn(100.00);
when(stock.getQuantity()).thenReturn(200);
when(stock.getValue()).thenCallRealMethod();

在此配置:

  • when(stock.getPrice()).thenReturn(100.00);:模拟 getPrice() 方法返回100.00.
  • when(stock.getQuantity()).thenReturn(200);:模拟 getQuantity() 方法返回 200。
  • when( stock.getValue()).thenCallRealMethod();:指定getValue() 方法应该按照原始代码中指定的方式执行。

或者,我们可以使用 spy() 方法来代替 mock() :

Stock stock = spy(Stock.class);
doReturn(100.00).when(stock).getPrice();
doReturn(200).when(stock).getQuantity();

在这种情况下,所有未存根的方法(例如 getValue())将调用其原始方法

值得注意的是,如果 getValue() 直接依赖于 getPrice() 和 getQuantity() 等模拟方法的值,而不是模拟返回值,则它们可能不会产生所需的结果。在这种情况下,完全避免模拟并依赖于测试中的实际实现可能更合适,如下所示:

Stock stock = new Stock(100.00, 200);
double value = stock.getValue();
assertEquals(100.00 * 200, value, 0.00001);

以上是如何使用 Mockito 有选择地模拟 Java 中的方法?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn