安卓注解未能注入RestService

3

您好,我无法在我的代码中注入RestService。 我正在进行测试驱动开发,因此我使用Robolectric来测试此代码。希望这不是AA+Robolectric的问题,我对此没有任何经验。 奇怪的是,在我的测试中,我可以手动插入生成的RestClient_,但它不会自动插入。 所以我可以这样做:

RestClient rest = new RestClient_(activity.getApplicationContext());

但是以下代码不起作用:
@RestService
RestClient restClient;

我在restClient上遇到了NullPointerException。

我也没有忘记@EBean标签。

@EBean
public class Player {
    @RestService
    RestClient restClient;

    private int playerId;

    public Player() {
    }

    public int getPlayerId() {
        return playerId;
    }

    public List<Card> getHand() {
        return restClient.getHand(playerId);
    }
}

我在日志中看到,Android Annotations已经正确处理了所有内容。

这是我使用Android Annotations的第一个项目,但我不明白为什么依赖注入不起作用。没有依赖注入几乎就失去了使用Android Annotations的所有好处。谢谢!

一些额外的信息:我正在一个被Android Annotations注释的REST服务中实例化我的Player对象。下面是创建Player对象的方法代码片段。

@Get(value = "/players/createAnonymous")
@Accept(MediaType.APPLICATION_JSON)
public Player createAnonymousPlayer();

你如何创建一个 Player 实例? - WonderCsabo
这是一个对象,我使用gsonserializer从另一个类中的rest服务获取。 - GoGoris
那不会起作用。你应该使用 Player_ 子类,它将具有依赖注入。但是,我认为这些对象应该只是简单的 POJOs,它们来自 REST 端点。 - WonderCsabo
是的,我明白了,谢谢。所以Android Annotations似乎不太容易进行测试。 没错,我无法在REST服务中返回EBean。我认为这是一个很大的缺点。 - GoGoris
你可以创建一个自定义的“转换器”,但我认为你实际上不应该这样做。 - WonderCsabo
1个回答

0

好的,这里是我的问题的答案。我希望它对其他有同样问题的人有所帮助。感谢WonderCsabo指引我正确的方向。

Android Annotations在编译时生成注释类。因此Player变成了Player_。当使用@Inject时,Android Annotations将在注释字段中注入Player_的实例。但是在我的情况下,RestClient_将返回Player而不是Player_(即没有处理注释的player对象,因此没有注入的RestClient_)。

我不知道是否可能使RestClient返回Player_。这将无法编译,因为在编译时尚不存在Player_类。

现在我也理解了Android Annotations的缺点。您无法轻松地测试代码,因为无法在测试中使用android annotations。您无法在任何地方交换测试类和生成的类。您也无法模拟注入的类,除非使用运行时模拟生成器(如PowerMock)。因此,如果需要依赖注入和简单的测试,则应寻找其他方法(例如Dagger)。


抱歉,但您完全错了。AndroidAnnotations完全在编译时工作,因为它是一个注解处理器。Player_类存在于编译时,您可以使用它。通过自定义的Converter,您可以返回Player_实例。 确实,AA依赖注入过于简单,例如您无法添加测试Module。关于使用AA测试代码,请阅读此文档 - WonderCsabo
非常抱歉,这确实是在编译时之后。我感到困惑的原因是:如果我说我的restservice返回Player_,它找不到Player_,因为javac删除了Player_的导入。我认为这是因为它无法看到该类被使用? - GoGoris
谢谢提供链接,我不知道我可以以那种方式注入模拟对象,但这仍然是一种狡猾的方法。 - GoGoris
Android Studio,在调试时突然消失了。 - GoGoris
我无法想象。你应该上传一个可以重现问题的小型测试项目,否则我们无法调查这个问题。 - WonderCsabo
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接