Java Play 2.4使用注入为类编写测试用例

时间:2016-02-10 14:58:52

标签: java dependency-injection playframework-2.4

最近我正在使用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());
        }
    });
}

1 个答案:

答案 0 :(得分:1)

在编写您的选项之前,我建议使用elastic4s。 这个第三方库将帮助您编写更多功能代码,并为您提供非常好的dsl来编写查询。 还有一件事,我不知道你使用elasticsearch的用例是什么,但我建议使用不同的客户端,然后使用其余的api,它将为您提供更安全的连接和更高效的服务。

你得到了NPE,因为你用自己设置ElasticSearch和new,并且不要让你接线,这就是WSClient为空的原因。

现在为您的选择, 您有两个选择:

将WithApplication添加到您的测试中,这将基本上加载您的应用程序,这将使您可以访问Guice注入器,您可以从中获取这样的ElasticSearch类,您有几种方法可以执行此操作:

  1. 正如使用

    播放documentation中所述
                         //dependency added here VVVVVVVVVV
    myApp.controller('TestController', ['$scope', 'allowed', function ($scope, allowed) {
    
  2. 导入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]
    
  3. 使用FakeApplication:只需抓住假应用程序注入器,并使用它来获取ElasticSearch类的实例。

  4. 我不喜欢上述选项,因为您需要运行一个应用程序,这会使您的测试速度变慢。 我建议你自己创建WSClient并用它实例化ElasticSearch类,并运行你的测试。

         import play.api.Play 
         val elasticsearch = Play.current.injector.instanceOf(classOf[ElasticSearch])
    

    这是一个更轻松的解决方案,应该让您的测试运行得更快。