Можно ли вводить макеты для тестирования в AndroidAnnotations?

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

<code>@Bean(MyImplementation.class)
MyInterface myInterface;
</code>

где класс для внедрения уже определен.

 apollodude21716 мая 2012 г., 14:20
Я хочу проверить класс, который я пишу. Я хочу внедрить макеты в класс, который я пишу для тестового кода, и внедрить «реальные» объекты для производства.
 John Ericksen14 мая 2012 г., 17:03
Вы хотите проверить свой класс или класс, сгенерированный AndroidAnnotations?

Ответы на вопрос(2)

Решение Вопроса

Если вы работаете с модульным тестированием, я бы предложил использовать mocks по старинке, используя метод установки и пытаясь протестировать 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 Activity (и других расширений Android) затруднено из-за исключительных заглушек и финальных классов / методов. Это где Robolectric пригодится (и настоятельно рекомендуется) для создания / отслеживания API Android.

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

К вашему вопросу, мне не известны какие-либо средства AndroidAnnotations, специально предназначенные для внедрения Mocks или введения Mocks в внедренное дерево зависимостей приложения.

 apollodude21716 мая 2012 г., 14:29
Благодарность. Я начал использовать Robolectric для модульных тестов. В приведенном выше примере вы хотите вызвать конструктор моего класса в тестовом методе, чтобы вообще обойти AndroidAnnotations во время тестов?
 John Ericksen16 мая 2012 г., 16:44
Вызов конструктора (с участием Robolectic) просто дает вам экземпляр Activity. Я бы не сказал, что это обходит AndroidAnnotaions. Но если вы протестируете свой класс «MyActivity» (против «MyActivity_»), у вас не будет сгенерированного кода, отвечающего за DI от AA.

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 чтобы позволитьgetInstance_() методMyImplementation_ верни макет. Это может потребовать некоторой начальной работы, потому что вам придется смешивать тестер PowerMock и Robolectric.

Редактировать: я обновилдокументаци с содержанием на основе этого вопроса.

 Pierre-Yves Ricau19 мая 2012 г., 17:46
Это как раз моя точка зрения
 Neil27 янв. 2015 г., 12:40
@ SebastianRoth извиняется за поздний ответ - я так и не нашел удовлетворительного решения для этого, и некоторое время назад бросил попытки.
 John Ericksen19 мая 2012 г., 17:29
+ 1. Интересно, что вы предлагаете протестировать сгенерированные действия (часть 2). Я думаю, что в Activity достаточно изменений, чтобы оправдать такой подход.
 Sebastian Roth22 окт. 2014 г., 05:43
@ Нил, ты нашел какое-нибудь решение для этого?
 Neil17 июл. 2013 г., 21:21
@ Piwaï Я не уверен, как будет работать вышеуказанный насмешливый подход. Если у вас есть какие-либо методы, аннотированные с AfterViews, они будут выполнены как часть создания Activity. Если у этих методов есть какие-либо зависимости, они потерпят неудачу - поскольку у вас еще не было возможности их смоделировать Есть идеи как обойти эт

Ваш ответ на вопрос