用AndroidAnnotations进行testing可以注入吗?

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

@Bean(MyImplementation.class) MyInterface myInterface; 

那里注入的课程已经确定了。

Solutions Collecting From Web of "用AndroidAnnotations进行testing可以注入吗?"

问题是,你是unit testing还是集成testing?

如果你是unit testing,我会build议使用模仿旧式的方式,通过使用setter并试图testingJava代码而不涉及dependency injection框架。 这将孤立地testing你的class级,避开了很多的复杂性。

我的意思是:

 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 } } 

当然,testingAndroid活动(以及Android的其他扩展)很困难,因为抛出存根和最终类/方法的exception。 这是Robolectric派上用场(强烈推荐)用于实例化/映射Android API的地方。

如果你是集成testing,你可能需要采取另一种方法。 就个人而言,我会尽量不要在整合testing期间模拟,因为我试图在生产环境中testing应用程序。 但是,如果你真的想嘲笑,你可以使用类似的方法进行unit testing,并在你站起来生成Activity类后引入一个模拟。 值得注意的是,您可以使用Robotium等框架直接在硬件上执行集成testing。

更重要的是,我不知道有任何AndroidAnnotations专门用于注入Mock或将Mocks引入到应用程序的注入依赖树中的工具。

johncarl的补充答案:

  • 没有办法告诉AndroidAnnotations你想注入模拟而不是真实的对象,因为它在编译时工作,所以代码必须始终是生产准备。

  • 我会build议testing生成的活动,补充Robolectric 。 注释是添加行为到你的代码,所以你不应该testing它,就好像没有注释。

  • 请小心testing您的活动行为,而不是AndroidAnnotations的行为。 该框架已经有自己的testing,以检查注释工作正确:)。

  • 您可以让AndroidAnnotations DI发生,然后重新注入模拟的依赖关系。 这些字段至less有默认的作用域,这意味着它们可以从同一个包中访问,所以你必须在与活动相同的包中创buildtesting。

     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_()方法返回一个模拟。 这可能需要一些初步的工作,因为你必须混合PowerMocktesting跑步者和Robolectrictesting跑步者。

编辑:我更新了基于这个问题的内容的文档 。