2016-02-10 3 views
2

Недавно я использую схему 2.4 для Java-проекта.Java Play 2.4 написать тестовый пример для класса с использованием инъекции

В этом я использую библиотеку 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

Можете ли вы поделиться тестовым кодом? – Tomer

+0

Hi Tomer, Спасибо за ваш ответ, я изменил вопрос и добавил тестовый код. –

+0

Вы хотите проверить функциональность elasticsearch? что вы загружаете фактический кластер elasticsearch и хотите его запросить? или вы хотите «высмеять» перенастроенные результаты из wsClinet? – Tomer

ответ

1

Прежде чем писать варианты у вас есть, я предлагаю использовать elastic4s. Эта сторонняя библиотека поможет вам написать более функциональный код и дать вам очень хороший dsl для написания ваших запросов. Еще одна вещь, я не знаю, что ваш использованный случай для использования elasticsearch, но я рекомендую использовать другой клиент, а затем остальные api, что даст вам более безопасное соединение и более эффективно.

Вы получаете NPE, потому что вы устанавливаете ElasticSearch своим новым и не допускаете к себе проводки, поэтому WSClient имеет значение NULL.

Теперь для ваших вариантов, У Вас есть 2 варианта:

Добавить WithApplication в тест, который будет в основном загрузить приложение, это даст вам доступ к Guice инжектора, из которого вы можете взять класс ElasticSearch как это у вас есть несколько способов сделать это:

  1. Как описано в игре documentation использованием

     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] 
    
  2. Импортируя Играть

     import play.api.Play 
        val elasticsearch = Play.current.injector.instanceOf(classOf[ElasticSearch]) 
    
  3. Использование FakeApplication: просто разжиться поддельными инжектора приложения, и использовать его, чтобы получить экземпляр класса ElasticSearch.

Мне не нравятся вышеуказанные параметры, потому что вам нужно приложение, которое может сделать ваши тесты очень медленными. Я предлагаю создать WSClient самостоятельно и создать экземпляр класса ElasticSearch и запустить ваши тесты.

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

Это более легкое решение и должно ускорить выполнение ваших тестов.