最近我正在使用Play 2.4框架进行Java项目。
我正在使用WsClient库。那个库是我班上注入的。
@Inject WSClient wsClient
现在我正在尝试为该类编写一个测试用例,但由于wsClient变量的空指针错误,测试用例失败。
wsClient.url("some url").get()
你能帮我解决这个问题吗?
以下是测试代码
// Class
public class ElasticSearch {
@Inject WSClient wsClient;
public Promise<WSResponse> createIndex() {
Logger.info("Entering ElasticSearch.createIndex()");
Logger.debug("WSClient: " + wsClient);
Promise<WSResponse> response =wsClient.url(this.getEsClient()+ "/" +this.getEsIndexName()).setContentType("application/json").put("");
Logger.info("Exiting ElasticSearch.createIndex()");
return response;
}
}
// Test function
@Test
public void testCreateIndex() {
running(fakeApplication(), new Runnable() {
public void run() {
ElasticSearch esearch= new ElasticSearch();
esearch.setEsIndexName("car_model");
assertNotNull(esearch.createIndex());
}
});
}
答案 0 :(得分:1)
在编写您的选项之前,我建议使用elastic4s。 这个第三方库将帮助您编写更多功能代码,并为您提供非常好的dsl来编写查询。 还有一件事,我不知道你使用elasticsearch的用例是什么,但我建议使用不同的客户端,然后使用其余的api,它将为您提供更安全的连接和更高效的服务。
你得到了NPE,因为你用自己设置ElasticSearch和new,并且不要让你接线,这就是WSClient为空的原因。
现在为您的选择, 您有两个选择:
将WithApplication添加到您的测试中,这将基本上加载您的应用程序,这将使您可以访问Guice注入器,您可以从中获取这样的ElasticSearch类,您有几种方法可以执行此操作:
正如使用
播放documentation中所述 //dependency added here VVVVVVVVVV
myApp.controller('TestController', ['$scope', 'allowed', function ($scope, allowed) {
导入Play
import play.api.inject.guice.GuiceInjectorBuilder
import play.api.inject.bind
val injector = new GuiceInjectorBuilder()
.configure("key" -> "value")
.bindings(new ComponentModule)
.overrides(bind[Component].to[MockComponent])
.injector
val elasticsearch = injector.instanceOf[ElasticSearch]
使用FakeApplication:只需抓住假应用程序注入器,并使用它来获取ElasticSearch类的实例。
我不喜欢上述选项,因为您需要运行一个应用程序,这会使您的测试速度变慢。 我建议你自己创建WSClient并用它实例化ElasticSearch类,并运行你的测试。
import play.api.Play
val elasticsearch = Play.current.injector.instanceOf(classOf[ElasticSearch])
这是一个更轻松的解决方案,应该让您的测试运行得更快。