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

Posted

技术标签:

【中文标题】Java Play 2.4 使用注入为类编写测试用例【英文标题】:Java Play 2.4 write test case for class using injection 【发布时间】:2016-02-10 14:58:51 【问题描述】:

最近我在 Java 项目中使用 play 2.4 框架。

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

【问题讨论】:

可以分享一下测试代码吗? 您好,Tomer,感谢您的回复,我已修改问题并添加了测试代码。 你想测试弹性搜索功能吗?意思是你加载一个实际的弹性搜索集群并想要查询它?或者您想“模拟”来自 wsClinet 的重新调整的结果? 我想测试我创建的 ElasticSearch 类功能。我正在使用 WSClient 向 ElasticSearch DB 发送调用 【参考方案1】:

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

你得到了 NPE,因为你自己用 new 安装了 ElasticSearch,并且不要让你的接线感到迷惑,这就是 WSClient 为空的原因。

现在供您选择, 你有两个选择:

将 WithApplication 添加到您的测试中,这将基本上加载您的应用程序,这将使您可以访问 Guice 注入器,您可以从中获取 ElasticSearch 类,您有两种方法可以做到这一点:

    如playdocumentation中所述,使用

         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]
    

    通过导入 Play

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

    使用 FakeApplication:只需获取虚假应用程序注入器,并使用它来获取 ElasticSearch 类的实例。

我不喜欢上面的选项,因为您需要运行一个应用程序,这会使您的测试变得非常缓慢。 我建议您自己创建 WSClient 并用它实例化 ElasticSearch 类,然后运行您的测试。

val httpClient = NingWSClient.apply()
val elasticsearch = new ElasticSearch(httpClient)

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

【讨论】:

以上是关于Java Play 2.4 使用注入为类编写测试用例的主要内容,如果未能解决你的问题,请参考以下文章

玩 2.4:如何使用 MultipartFormData 编写文件上传测试用例

使用 Eclipse Scala IDE 中的 spring-data 注入测试 playframework 2.4

Play 2.4 在使用 DI 时首次请求需要更多时间

在 Play 框架中注入 MongoDB 实例 [java]

Play 2.4 WebSocket在使用编译时依赖注入时抛出InstantiationException

Play Framework 2.4 在 Scala 模板中使用注入变量