您好我无法在我的代码中的任何位置注入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();
答案 0 :(得分:0)
好的,这是我的问题的答案。我希望它可以用于那些像我一样问自己的人。感谢WonderCsabo指出我正确的方向。
Android Annotations在编译时生成带注释的类。所以玩家成为Player_。使用@Inject时,Android Annotations将在带注释的字段中注入Player_的实例。但是在我的情况下,RestClient_将返回Player而不是Player_(因此没有处理注释的播放器对象,因此没有注入的RestClient_)。
让RestClient返回Player_是不可能的(不是我所知道的)。这将无法编译,因为Player_类在编译时尚不存在。
现在我也了解Android Annotations的缺点。您无法轻松测试代码,因为您无法在测试中使用android注释。您无法在任何地方将生成的类与测试类交换。如果不使用运行时模拟生成器作为PowerMock,则无法模拟注入的类。因此,如果您需要依赖注入和简单测试,您应该在其他地方寻找。 (例如Dagger)