我还没有找到任何关于如何做到这一点的例子。我假设这是不可能的基于这样的例子:
@Bean(MyImplementation.class)
MyInterface myInterface;
要注入的类已经确定。
我还没有找到任何关于如何做到这一点的例子。我假设这是不可能的基于这样的例子:
@Bean(MyImplementation.class)
MyInterface myInterface;
要注入的类已经确定。
对约翰卡尔回答的补充:
没有办法告诉 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 测试运行器。
编辑:我根据这个问题用内容更新了文档。
问题是,你是单元测试还是集成测试?
如果您进行单元测试,我建议您使用老式的模拟方式,即使用 setter 并尝试在不涉及依赖注入框架的情况下测试 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等框架直接在硬件上执行集成测试。
对于您的问题,我不知道专门用于注入 Mocks 或将 Mocks 引入应用程序的注入依赖树的任何 AndroidAnnotations 工具。