8

我还没有找到任何关于如何做到这一点的例子。我假设这是不可能的基于这样的例子:

@Bean(MyImplementation.class)
MyInterface myInterface;

要注入的类已经确定。

4

2 回答 2

8

对约翰卡尔回答的补充:

  • 没有办法告诉 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 测试运行器。

编辑:我根据这个问题用内容更新了文档。

于 2012-05-19T15:18:26.140 回答
6

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

如果您进行单元测试,我建议您使用老式的模拟方式,即使用 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 工具。

于 2012-05-14T16:14:05.520 回答