是否可以使用AndroidAnnotations注入模拟测试用于测试目的?
我还没有找到任何关于如何做到这一点的例子。我假设基于这样的示例是不可能的:是否可以使用AndroidAnnotations注入模拟测试用于测试目的?
@Bean(MyImplementation.class)
MyInterface myInterface;
其中要注入的类已经确定。
问题是,你是单元测试还是集成测试?
如果你是单元测试,我会建议使用模拟老式的方式,通过使用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直接在硬件上执行集成测试。
更多关于你的问题,我不知道有任何AndroidAnnotations的工具专门用于注入Mock或将Mocks引入到应用程序的注入依赖树中。
谢谢。我已经开始使用Robolectric进行单元测试。在上面给出的例子中,你是否说在测试方法中调用我的类的构造函数以便在测试期间绕过AndroidAnnotation? – apollodude217
调用构造函数(包含Robolectic)只会为您提供一个活动的实例。我不会说这会绕过AndroidAnnotaions。但是,如果你测试你的类“MyActivity”(vs“MyActivity_”),那么你将不会有生成的代码负责AA的DI。 –
的补充,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)的工具使用运行时字节码操作来让方法MyImplementation_
返回一个模拟。这可能需要一些初始工作,因为你必须混合使用PowerMock测试运行器和Robolectric测试运行器。
编辑:我更新了documentation与内容基于这个问题。
+1。有趣的是,你建议测试生成的活动(p.2)。我想活动有足够的变化来保证这种方法。 –
这就是我的观点:) –
@Piwaï我不确定上述嘲讽方法是如何工作的。如果您有任何使用AfterViews注释的方法,它们将作为活动创建的一部分执行。如果这些方法有任何依赖关系,它们将会失败 - 因为你还没有机会嘲笑它们。有关如何解决此问题的任何想法? – Neil
您是否在考虑测试您的班级或AndroidAnnotations生成的班级? –
我想测试一个我写的类。我想将模拟注入到为测试代码编写的类中,并为生产注入“真实”对象。 – apollodude217