是否可以使用AndroidAnnotations注入模拟测试用于测试目的?

是否可以使用AndroidAnnotations注入模拟测试用于测试目的?

问题描述:

我还没有找到任何关于如何做到这一点的例子。我假设基于这样的示例是不可能的:是否可以使用AndroidAnnotations注入模拟测试用于测试目的?

@Bean(MyImplementation.class) 
MyInterface myInterface; 

其中要注入的类已经确定。

+0

您是否在考虑测试您的班级或AndroidAnnotations生成的班级? –

+0

我想测试一个我写的类。我想将模拟注入到为测试代码编写的类中,并为生产注入“真实”对象。 – apollodude217

问题是,你是单元测试还是集成测试?

如果你是单元测试,我会建议使用模拟老式的方式,通过使用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引入到应用程序的注入依赖树中。

+0

谢谢。我已经开始使用Robolectric进行单元测试。在上面给出的例子中,你是否说在测试方法中调用我的类的构造函数以便在测试期间绕过AndroidAnnotation? – apollodude217

+1

调用构造函数(包含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

+1。有趣的是,你建议测试生成的活动(p.2)。我想活动有足够的变化来保证这种方法。 –

+0

这就是我的观点:) –

+1

@Piwaï我不确定上述嘲讽方法是如何工作的。如果您有任何使用AfterViews注释的方法,它们将作为活动创建的一部分执行。如果这些方法有任何依赖关系,它们将会失败 - 因为你还没有机会嘲笑它们。有关如何解决此问题的任何想法? – Neil