Android注释没有注入RestService

时间:2015-02-09 20:07:11

标签: android android-annotations

您好我无法在我的代码中的任何位置注入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-annotated REST Service中实例化我的Player对象。创建Player对象的方法的代码片段。

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

1 个答案:

答案 0 :(得分:0)

好的,这是我的问题的答案。我希望它可以用于那些像我一样问自己的人。感谢WonderCsabo指出我正确的方向。

Android Annotations在编译时生成带注释的类。所以玩家成为Player_。使用@Inject时,Android Annotations将在带注释的字段中注入Player_的实例。但是在我的情况下,RestClient_将返回Player而不是Player_(因此没有处理注释的播放器对象,因此没有注入的RestClient_)。

让RestClient返回Player_是不可能的(不是我所知道的)。这将无法编译,因为Player_类在编译时尚不存在。

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