Мне было интересно, как тестировать зависимости в MainActivity в Android. Это упрощенный пример. Я хочу высмеять MyClass
с Mockito.Как использовать Mockito для проверки зависимостей в MainActivity onCreate Android
public class MainActivity extends Activity {
MyClass myClass;
@Override
protected void onCreate(Bundle savedInstanceState) {
myClass = new MyClass();
myClass.doSomething();
}
}
Я пробовал использовать метод Static Factory, и я изучил некоторые другие шаблоны фабрик. Беда в том, что MainActivity.onCreate
выглядит как тупик, где трудно ввести макет MyClass
.
Есть ли способ высмеять MyClass
с помощью Mockito здесь, не используя другую насмешливую или зависимую библиотеку инъекций? Я очень рад реструктурировать код по мере необходимости.
UPDATE Я просто подумал, что могу использовать сеттер. Будет ли это подходящим решением? Основная проблема, которую я вижу, заключается в том, что она создает сеттер исключительно для макета, который не подходит никому другому. По крайней мере, он может быть закрытым для ограничения доступа.
public class MainActivity extends Activity {
MyClass myClass;
@Override
protected void onCreate(Bundle savedInstanceState) {
setMyClass(new MyClass());
myClass.doSomething();
}
void setMyClass(MyClass myClass) {
this.myClass = myClass;
}
}
UPDATE 2 Я также понял, что не делает myClass
личное, я могу использовать что-то вроде mMyActivity.myClass = mockMyClass
. Это хороший способ сделать это? Я думаю, что myClass
действительно должен был быть приватным. Это также означает, что запуск конструктора по умолчанию запускается для создания myClass
, а затем изменения его состояния таким образом, который обычно не должен происходить.
Я заметил PowerMockito. Я был обеспокоен тем, что он сказал, что он работает, изменяя байт-код. Может ли это вызвать неожиданные последствия? Есть ли на что обратить внимание? –
Да, одним недостатком было бы то, что покрытие кода может работать не так, как ожидалось. Если вы разрешите PowerMockito модифицировать свой класс с помощью @PrepareForTest, никакое покрытие не будет рассчитано с помощью JaCoCo. Для некоторых классов пользовательского интерфейса я создал внутренний заводский класс для сохранения данных покрытия. –