2015-09-04 2 views
0

Мне было интересно, как тестировать зависимости в 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, а затем изменения его состояния таким образом, который обычно не должен происходить.

ответ

1

Если вы добавите PowerMockito, вы можете сделать это с помощью PowerMockito.whenNew(MyClass.class). Но вы бы хотели добавить @PrepareForTest(MainActivity.class) в свою тестовую камеру

+0

Я заметил PowerMockito. Я был обеспокоен тем, что он сказал, что он работает, изменяя байт-код. Может ли это вызвать неожиданные последствия? Есть ли на что обратить внимание? –

+1

Да, одним недостатком было бы то, что покрытие кода может работать не так, как ожидалось. Если вы разрешите PowerMockito модифицировать свой класс с помощью @PrepareForTest, никакое покрытие не будет рассчитано с помощью JaCoCo. Для некоторых классов пользовательского интерфейса я создал внутренний заводский класс для сохранения данных покрытия. –

1

Посмотрите на Dagger 2.

С первого взгляда неясно, как его использовать. Но взгляните на примеры - https://github.com/chiuki/friendspell

+0

Кинжал был моей оригинальной мыслью об этом. Я надеялся, что будет такой способ, не добавляя дополнительный уровень сложности в приложение, такое как Dagger. –

Смежные вопросы