2017-02-21 52 views
4

У меня есть класс под названием Availability.java и два метода.Mockito - внутренний метод call

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

, если я правильно понимаю, мы не можем издеваться над внутренними вызовами метода. Правильно ли? – 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. Только пустотные методы могут делатьNothing()! Пример правильного использования doNothing(): doNothing(). doThrow (новый RuntimeException()) .when (mock) .someVoidMethod(); Вышеуказанные значения: someVoidMethod() ничего не делает в первый раз, но выбрасывает исключение, второй раз называется – user2057006

+0

Правильно .. doReturn следует использовать .. извините, что сделал много тестов в последнее время .. и не обратил 100% внимания на пример –

+0

нет проблема. Спасибо за ваш ответ – user2057006