Mockito - 内部方法调用

11

我有一个名为Availability.java的类,其中包含两个方法。

 public Long getStockLevelStage() {
     //some logic
      getStockLevelLimit();
    }

    public Long getStockLevelLimit() {
      String primaryOnlineArea = classificationFeatureHelper.getFirstFeatureName(productModel, FEATURE_CODE_PRODUCT_ONLINE_AREA_PRIMARY, language);
................
      return new Long();
    }

我正在编写一个单元测试类 AvailabilityTest.java

@RunWith(MockitoJUnitRunner.class)
public class AvailabilityTest {
  @InjectMocks
  private Availability availability = new Availability();

  @Test
  public void testGetStockLevelStage() {
    availability.getStockLevelStage();
  }
}

当我调用 availability.getStockLevelStage() 方法时,它会调用 getStockLevelLimit() 方法。是否有可能模拟内部方法调用?

在这种情况下,当执行 getStockLevelStage() 方法时,我不希望执行 getStockLevelLimit() 方法。

请帮忙。

2个回答

14

试一试:

@RunWith(MockitoJUnitRunner.class)
public class AvailabilityTest {
    @InjectMocks
    @Spy
    private Availability availability = new Availability();

    @Test
    public void testGetStockLevelStage() {
       Mockito.doReturn(expectedLong).when(availability).getStockLevelLimit();
       availability.getStockLevelStage();
    }
}

如果您需要进一步阅读,这里是我撰写的有关Mockito Spying的文章。


我感觉对于只有void方法的情况下什么都不起作用。但是我的getStockLevelLimit()方法返回Long类型。只有void方法可以使用doNothing()!正确使用doNothing()的示例: doNothing(). 如果在mock.someVoidMethod()被调用时第一次什么都不做,第二次则会抛出一个RuntimeException异常。以上内容已翻译完成,仅供参考。 - user2057006
正确的做法是使用doReturn,抱歉最近进行了太多测试,没有完全注意到示例。 - Maciej Kowalski
如果Availability的构造函数调用了我想要模拟的方法,我该怎么办? - T3rm1

10
如果在您的测试中不需要执行getStockLevelLimit(),那么这意味着您希望以某种方式模拟受测试类的影响。
这样做会降低所测试行为的相关性和真实性。
您应该模拟依赖项而不是测试类的内部方法。
我猜想您不想执行getStockLevelLimit()是因为它使用了外部依赖项,而您想要隔离或类似的东西。
因此,您应该模拟和隔离getStockLevelLimit()背后的内容,并且这并不直接构成Availability类的一部分。

如果我理解正确的话,我们无法模拟内部方法调用。是这样吗? - user2057006
我没有将getStocklevelLimit()方法移动到另一个类并进行模拟的选项。当前代码由另一位同事编写,存在一些限制。正如您所说,有一种方法可以实现。您能否根据我发布的当前代码提出建议? - user2057006
我想补充一点,如果你的代码是遗留代码,使用spy是合适的,因为它使用了太多的依赖项,而且没有重构代码的方法。否则应该遵循@davidxxx的建议。 - Maciej Kowalski
1
感谢David和Maciej的回复。在这次长时间的讨论后,我学到了一些新的东西。我将重构代码。所以,我会接受这个作为答案。 - user2057006
1
好的答案,它应该模拟类外部的调用。 - EM-Creations
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接