Как выполнить модульное тестирование метода, который просто инициализирует переменную в junit - PullRequest
0 голосов
/ 14 марта 2019

У меня есть метод, подобный следующему

  public void init() {
        String message = getApplication().getString(R.string.empty_message_with_user,user.getUsername());
        emptyMessageText = new ObservableField<>(message);
    }

Я тестировал этот метод, как следующий

@Test
public void init_isCalled() {
    MyClass myClass = mock(MyClass.class);
    doNothing().when(myClass).init();
    myClass.init();

    verify(myClass, times(1)).init();
 }

Вышеприведенный тест выполняется нормально, но проблема в том, что когда я смотрю отчет о покрытии, онпоказывает, что метод не охватывается тестом, я создаю отчет о покрытии с помощью jacoco.

Ответы [ 2 ]

0 голосов
/ 16 марта 2019

Когда мы смотрим на ваш класс MyClass и как он будет использоваться позже, он будет иметь следующую структуру:

+---------------+           +--------------+           +----------------+
|Production Code| +-------> |MyClass.init()| +-------> |getApplication()|
+---------------+           +--------------+           +----------------+

Теперь, чтобы протестировать метод MyClass.init(), полезная настройка теста может выглядеть следующим образом:

+---------+                 +--------------+           +-----------------------+
|Test Code| +-------------> |MyClass.init()| +-------> |mocked getApplication()|
+---------+                 +--------------+           +-----------------------+

Тестовый код вызовет метод MyClass.init(), потому что это метод, который вы хотите протестировать. Вы не хотите тестировать другие классы / методы, которые вызываются MyClass.init(), и, таким образом, это может быть хорошим вариантом для насмешки над ними. (Обратите внимание, что это не является обязательным, иногда вы можете просто достичь всех целей модульного тестирования, используя другие компоненты, которые используются без изменений.)

Однако вы сделали следующее:

+---------+                 +---------------------+
|Test Code| +-------------> |mocked MyClass.init()|
+---------+                 +---------------------+

И теперь вы можете ясно видеть, почему вы также не видите никаких покрытых строк в оригинальном MyClass.init(), потому что это просто не вызывается.

0 голосов
/ 14 марта 2019

Вы можете смоделировать метод init при создании теста, в котором он вызывается из другого метода.

Но если вы хотите протестировать сам метод init (и получить его покрытие), вам не нужно его высмеивать.Просто позвоните из своего теста.В свою очередь, вы можете смоделировать getApplication() звонок при необходимости.

...