2017-02-21 117 views
4

我有一个叫做Availability.java的类,有两种方法。Mockito - 内部方法调用

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()方法。是否可以模拟内部方法调用?

在这种情况下,我不想getStockLevelLimit()被执行,当getStockLevelStage()得到执行。

请帮忙。

回答

4

如果getStockLevelLimit()有没有你的测试过程中执行的,这意味着你需要模拟被测类某种方式。
这样做会降低测试行为的相关性和真实性。

您应该模拟依赖关系,而不是测试类的内部方法。
我想你不想执行getStockLevelLimit(),因为它使用了你想要隔离的外部依赖或者类似的东西。
所以你应该模拟和隔离getStockLevelLimit()后面的那个,这并不直接成为Availability类的一部分。

+0

如果我理解正确,我们不能模拟内部方法调用。 tat是否正确? – user2057006

+0

您可以但只有在您无法完成您的测试时才应该这样做。代码应该设计为自然可测试的。嘲讽被测实例的私有方法是非常自然的。 – davidxxx

+0

我没有选择将getStocklevelLimit()方法移动到另一个类并对其进行模拟。当前代码由另一个同事编写时有一些限制。正如你所说有办法做到这一点。你可以请我建议我现在的代码,我张贴? – user2057006

3

试试这个:

@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(); 
    } 
} 
+0

我觉得donthing只适用于无效的方法。但我的getStockLevelLimit()方法返回Long。只有void方法才可以做()! (): doNothing()。 doThrow(new RuntimeException()) .when(mock).someVoidMethod(); 上面的意思是: someVoidMethod()第一次不做任何事情,但第二次抛出异常 – user2057006

+0

正确.. doReturn应该被使用..对不起,最近做很多测试..并没有支付100%关注该示例 –

+0

没问题。感谢您的回复 – user2057006