Я не нашел примеров того, как это сделать. Я предполагаю, что это невозможно, основываясь на таких примерах:
@Bean(MyImplementation.class)
MyInterface myInterface;
где класс для ввода уже определен.
Я не нашел примеров того, как это сделать. Я предполагаю, что это невозможно, основываясь на таких примерах:
@Bean(MyImplementation.class)
MyInterface myInterface;
где класс для ввода уже определен.
Вопрос в том, проводите ли вы модульное или интеграционное тестирование?
Если вы проводите модульное тестирование, я бы предложил использовать макеты по старинке, используя сеттер и пытаясь протестировать код 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 пригодится (и настоятельно рекомендуется) для создания/затенения Android API.
Если вы проводите интеграционное тестирование, вы можете использовать другой подход. Лично я бы постарался не имитировать во время интеграционных тестов, поскольку я пытаюсь протестировать приложение, как оно будет работать в производственной среде. Но, если вы действительно хотите издеваться, вы можете использовать аналогичный подход к модульному тестированию и ввести макет после того, как вы поднимете свой сгенерированный класс 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.
Изменить: я обновил документацию, добавив контент, основанный на этом вопросе.