Mockito - 内部方法调用

use*_*006 5 java junit unit-testing mockito spy

我有一个叫做的类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();
    }
Run Code Online (Sandbox Code Playgroud)

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

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

  @Test
  public void testGetStockLevelStage() {
    availability.getStockLevelStage();
  }
}
Run Code Online (Sandbox Code Playgroud)

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

在这种情况下,我不希望getStockLevelLimit()在执行时getStockLevelStage()执行.

请帮忙.

Mac*_*ski 5

尝试这个:

@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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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


dav*_*xxx 5

如果getStockLevelLimit()在测试期间没有执行,则意味着你想以某种方式模拟被测试的类.
这样做会降低测试行为的相关性和真实性.

您应该模拟依赖项而不是测试类的内部方法.
我想你不想执行,getStockLevelLimit()因为它使用你想要隔离的外部依赖或类似的东西.
因此,您应该模拟并隔离背后的内容getStockLevelLimit(),而不是直接成为Availability课程的一部分.