2015-11-09 3 views
0

Я использую Android SDK и junit4 + Mockito для модульного тестирования. Скажем, у меня есть класс, как это в моем приложении:Отказывание класса присваивает nulls полям @NonNull (Android)

public class Container{ 

    @NonNull private Set<String> values = new HashSet<>(); 

    public void addValue(String value) { 
    values.add(value); 
    } 

    @NonNull 
    public Set<String> getValues() { 
    return values; 
    } 
} 

И у меня также есть модульный тест с Mockito который выглядит следующим образом:

public class ContainerTest { 

    private Container container; 

    @Before 
    public void before() { 
    container = mock(Container.class); 
    } 

    @Test 
    public void shouldAddValue() { 
    container.add("test_value"); 
    assertTrue(container.getValues.contains("test_value")); 
    } 

} 

Этот тест на самом деле не будет работать на линии «container.add ("test_value");» потому что макет (Container.class) создает класс, в котором значения поле фактически установлен в нуль, так values.add (значение) в AddValue() метод выдает NPE. Я мог бы добавить нулевую проверку в addValue(), чтобы исправить это, но это кажется абсурдным, поскольку значения уже объявлены не равными нулю.

Есть ли способ сделать Mockito уважением @NonNull аннотации и правильно инициализировать поле?

ответ

0

Я думаю, что вы не используете Mockito в правильном направлении, так как вам нужно определить поведение Mockito.

Например, вы должны иметь что-то вроде этого:

@Test 
public void shouldAddValue() { 
    Set<String> mySet = new HashSet<String>(); 
    mySet.put("test_value"); 

    // Mock container getValues() method to return mySet 
    when(container.getValues()).thenReturn(mySet); // do import static for Mockito.when 

    assertTrue(container.getValues().contains("test_value")); 
} 

Mockito работает довольно хорошо, когда вы фиктивные ответы, но то, что вы хотите, чтобы позволить Mockito инициализировать классы для вас, которые явно не Mockito цели.

Поэтому, если вы хотите проверить ваш объект контейнера, то вам не придется издеваться контейнер себя, и вы можете иметь что-то вроде этого:

public class ContainerTest { 

    private Container container; 

    @Before 
    public void before() { 
     container = new Container(); // Initialize container 
    } 

    @Test 
    public void shouldAddValue() { 
     container.addValue("test_value"); 
     assertTrue(container.getValues().contains("test_value")); 
    } 

} 
+0

Эй, спасибо. Я пошел с первым вариантом, насмешливым методом getValues ​​(). –

+0

@ АнтонЧеркашин рад помочь. Спасибо за тик –