apo*_*217 8 android unit-testing mocking ioc-container android-annotations
我还没有找到任何关于如何做到这一点的例子.我假设基于这样的例子是不可能的:
@Bean(MyImplementation.class)
MyInterface myInterface;
Run Code Online (Sandbox Code Playgroud)
注入的类已经确定.
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);
Run Code Online (Sandbox Code Playgroud)在AndroidAnnotations中,通过调用注入依赖项MyImplementation_.getInstance_().您可以使用PowerMock等工具对运行时字节码进行操作,以使getInstance_()方法MyImplementation_返回模拟.这可能需要一些初步的工作,因为你必须混合PowerMock测试运行器和Robolectric测试运行器.
编辑:我根据此问题更新了包含内容的文档.
问题是,您是单元测试还是集成测试?
如果你是单元测试,我会建议使用老式方法使用mocks,使用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
}
}
Run Code Online (Sandbox Code Playgroud)
当然,测试Android活动(以及Android的其他扩展)很困难,因为抛出存根和最终类/方法的异常.这就是Robolectric在实例化/遮蔽Android API时派上用场(强烈推荐)的地方.
如果您是集成测试,您可能想采取另一种方法.就个人而言,我会尝试不在集成测试期间进行模拟,因为我尝试测试应用程序,因为它将在生产中运行.但是,如果你真的想要模拟,你可以使用类似的单元测试方法,并在你站起来生成的Activity类之后引入一个模拟.值得注意的是,您可以使用Robotium等框架直接在硬件上执行集成测试.
更多问题,我不知道AndroidAnnotations的任何设施专门用于注入模拟或将Mocks引入应用程序的注入依赖树.
| 归档时间: |
|
| 查看次数: |
3930 次 |
| 最近记录: |