Android 注释未注入 RestService

Android annotations not injecting RestService

您好,我无法在我的代码中的任何位置注入 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 注释的项目,我不明白为什么依赖注入不起作用。没有依赖注入几乎消除了使用 Android 注解的所有好处。 提前致谢!

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

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

好的,这就是我的问题的答案。我希望它能对其他和我一样问自己的人有用。感谢 WonderCsabo 为我指明了正确的方向。

Android 注释在编译时生成带注释的 classes。所以 Player 变成了 Player_。使用@Inject 时,Android 注解将在注解字段中注入一个Player_ 实例。但是在我的例子中,RestClient_ 将 return Player 而不是 Player_(因此播放器对象没有经过处理的注释,因此没有注入的 RestClient_)。

不可能(据我所知)制作 RestClient return Player_。这不会编译,因为 Player_ class 在编译时还不存在。

现在我也明白了Android注解的弊端了。您不能轻松地测试代码,因为您不能在测试中使用 android 注释。您不能在任何地方将 testclass 与生成的 class 交换。如果不使用运行时模拟生成器作为 PowerMock,您也不能模拟注入的 classes。所以如果你需要依赖注入和简单的测试,你应该去别处看看。 (以匕首为例)