【问题标题】:Is it possible to inject mocks for testing purposes with AndroidAnnotations?是否可以使用 AndroidAnnotations 注入模拟以进行测试?
【发布时间】:2012-05-14 21:58:40
【问题描述】:

我还没有找到任何关于如何执行此操作的示例。我假设这是不可能的基于这样的例子:

@Bean(MyImplementation.class)
MyInterface myInterface;

要注入的类在哪里已经确定了。

【问题讨论】:

  • 您是要测试您的类还是 AndroidAnnotations 生成的类?
  • 我想测试我写的一个类。我想将模拟注入我为测试代码编写的类中,并为生产注入“真实”对象。

标签: android unit-testing mocking ioc-container android-annotations


【解决方案1】:

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_getInstance_() 方法返回一个模拟。不过,这可能需要一些初始工作,因为您必须混合使用 PowerMock 测试运行器和 Robolectric 测试运行器。

编辑:我根据这个问题更新了documentation 的内容。

【讨论】:

  • +1。有趣的是,您建议测试生成的活动 (pt.2)。我想 Activity 有足够的变化来保证这种方法。
  • @Piwaï 我不确定上述模拟方法将如何工作。如果您有任何使用 AfterViews 注释的方法,它们将作为 Activity 创建的一部分执行。如果这些方法有任何依赖关系,它们将失败 - 因为您还没有机会模拟它们。关于如何解决这个问题的任何想法?
  • @Neil 你找到解决办法了吗?
  • @SebastianRoth 对迟到的回复表示歉意 - 我从来没有为此找到令人满意的解决方案,并在一段时间前放弃了尝试。
  • @Piwaï 我在这里做什么stackoverflow.com/questions/36064047/…
【解决方案2】:

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

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

【讨论】:

  • 谢谢。我已经开始使用 Robolectric 进行单元测试。在您上面给出的示例中,您是说在测试方法中调用我的类的构造函数以便在测试期间完全绕过 AndroidAnnotations?
  • 调用构造函数(涉及 Robolectic)只会得到一个 Activity 实例。我不会说这绕过了 AndroidAnotaions。但是,如果您测试您的类“MyActivity”(与“MyActivity_”),那么您将不会生成负责 AA 的 DI 的代码。
猜你喜欢
  • 1970-01-01
  • 2015-02-21
  • 1970-01-01
  • 1970-01-01
  • 2016-05-15
  • 1970-01-01
  • 2022-06-13
  • 2021-06-29
  • 1970-01-01
相关资源
最近更新 更多