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

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

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

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

Ответы на вопрос(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 в внедренное дерево зависимостей приложения.

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.

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

ВАШ ОТВЕТ НА ВОПРОС