8

Я не нашел примеров того, как это сделать. Я предполагаю, что это не возможно, основываясь на примерах, как это:Можно ли вводить насмешки для тестирования с помощью AndroidAnnotations?

@Bean(MyImplementation.class) 
MyInterface myInterface; 

, где уже определен класс впрыснуть.

+0

Вы хотите проверить свой класс или класс, созданный AndroidAnnotations? –

+0

Я хочу проверить класс, который я пишу. Я хочу вводить mocks в класс, который я пишу для тестового кода, и вводить «реальные» объекты для производства. – apollodude217

ответ

6

Вопрос в том, тестируете ли вы модульное тестирование или интеграционное тестирование?

Если вы являетесь модульным тестированием, я бы предложил использовать издевательства старомодным способом, используя сеттер и пытаясь проверить код Java без задействованной инфраструктуры вложения. Это проверит ваш класс изолированно и обойдется много сложнее.

Что я имею в виду:

public class Test{ 

    ClassInTest inTest; 
    MyInterface myInterface; 

    @Before 
    public void setup(){ 
     inTest = new ClassInTest(); 
     //or your favorite mocking frameowrk 
     myInterface = EasyMock.createMock(MyInterface.class); 
     inTest.setMyInterface(myInterface); 
    } 

    @Test 
    public void testMethod(){ 
     //...mocking test code 
    } 
} 

Конечно, тестирование Android деятельности (и другие расширения Android) трудно из-за исключения бросали окурки и конечные классы/методы. Здесь Robolectric пригодится (и очень рекомендуется) для создания/теневого использования API Android.

Если вы тестируете интеграцию, вы можете захотеть воспользоваться другим подходом. Лично я постараюсь не издеваться над интеграционными тестами, поскольку я пытаюсь протестировать приложение так, как оно будет работать в процессе производства. Но, если вы действительно хотите насмехаться, вы можете использовать аналогичный подход к модульному тестированию и ввести макет после того, как вы встанете на сгенерированный класс активности. Стоит отметить, что вы можете выполнять интеграционные тесты непосредственно на аппаратном обеспечении, используя фреймворки, такие как Robotium.

Подробнее о вашем вопросе, я не знаю о каких-либо средствах AndroidAnnotations специально для инъекций Mocks или введения Mocks в вложенное дерево зависимостей приложения.

+0

Спасибо. Я начал использовать Robolectric для модульных тестов. В приведенном выше примере вы говорите, чтобы вызвать конструктор моего класса в методе тестирования, чтобы обойти AndroidAnnotations во время тестов вообще? – apollodude217

+1

Вызов конструктора (с участием Robolectic) просто дает вам экземпляр Activity. Я бы не сказал, что обходит AndroidAnnotaions. Но если вы проверите свой класс «MyActivity» (vs «MyActivity_»), то у вас не будет сгенерированного кода, ответственного за DI из AA. –

8

Дополнение к johncarl Ответ:

  • Там нет никакого способа сказать AndroidAnnotations, что вы хотите, чтобы придать издевается вместо реальных объектов, потому что он работает во время компиляции, так что код должен быть всегда производство готов.

  • Я бы рекомендовал протестировать сгенерированные действия в дополнение к Robolectric. Аннотации добавляют поведение к вашему коду, поэтому вы не должны его проверять, как если бы не было аннотаций.

  • Будьте осторожны, проверяя поведение своей деятельности, а не поведение AndroidAnnotations. У рамки уже есть собственные тесты, чтобы проверить, что аннотации работают правильно :).

  • Вы можете разрешить запуск AndroidAnnotations DI, а затем заново настроить издеваемую зависимость. Поля имеют по крайней мере область по умолчанию, что означает, что к ним можно получить доступ из одного и того же пакета, поэтому вам нужно будет создать тест в том же пакете, что и действие.

    MyActivity_ activity = new MyActivity_(); 
    
    // myInterface gets injected 
    activity.onCreate(null); 
    
    // you reinject myInterface 
    activity.myInterface = Mockito.mock(MyInterface.class); 
    
  • В AndroidAnnotations, зависимости вводятся путем вызова MyImplementation_.getInstance_(). Вы можете использовать манипуляции с байт-кодом во время выполнения с помощью инструмента, такого как PowerMock, чтобы метод MyImplementation_ возвращал макет. Это может потребовать некоторой первоначальной работы, потому что вам придется смешать тест-драйв PowerMock и тест-драйв Robolectric.

Редактировать: Я обновил documentation с контентом по этому вопросу.

+1

+1. Интересно, что вы предлагаете тестировать созданные действия (pt.2). Я предполагаю, что на мероприятие достаточно изменений, чтобы оправдать этот подход. –

+0

Это точно моя точка :) –

+1

@ Piwaï Я не уверен, как будет работать вышеупомянутый смехотворный подход. Если у вас есть какие-либо методы, аннотированные с помощью AfterViews, они будут исполняться как часть создания Activity. Если у этих методов есть какие-то зависимости, они потерпят неудачу, поскольку у вас еще не было возможности их издеваться. Любые идеи о том, как обойти это? – Neil