2015-04-02 3 views
2

Я пишу JUnit с использованием Mockito для метода, который имеет ниже условия:Как Обойти/Mock Zookeeper соединение

if(curatorFramework.getZooKeeperClient().isConnected() { 
    //do something 
} 

я должен сделать что-то проверить часть. Для этого я пытаюсь исправить условие IF для true. Я попытался ниже:

@Mock CuratorFramework curatorFrameworkMock 
when(curatorFrameworkMock.getZooKeeperClient().isConnected()).thenReturn(true); 

Но он бросает NullPointerException потому

curatorFrameworkMock.getZooKeeperClient() 
expects ZooKeeperClient Object to call isConnected().

Там нет никакого способа, я могу создать объект ZooKeeperClient в моем JUnit классе. Как установить это условие IF в значение TRUE через Mocking?

ответ

2

Просто создайте макет объекта для CuratorZookeeperClient и попросите этот объект высмеять ответ на isConnected.

CuratorZookeeperClient curatorZookeeperClientMock = Mockito.mock(CuratorZookeeperClient.class); 
when(curatorZookeeperClientMock.isConnected()).thenReturn(true); 

CuratorFramework curatorFrameworkMock = Mockito.mock(CuratorFramework.class); 
when(curatorFrameworkMock.getZookeeperClient()).thenReturn(curatorZookeeperClientMock); 
+0

Я пробовал это одинаково. Он по-прежнему выбрасывает исключение NullPointerException в условии IF. –

+0

Даже когда вы передаете объект 'curatorZookeeperClientMock' в качестве результата mock для getZookeeperClient()'? Эта настройка отлично подходит для меня с использованием версии Mockito 1.10.8 –

+0

Да. Я пробовал это, прежде чем вы отправили этот ответ, и он выбрасывает исключение NullPointerException. btw Я на Mockito 1.9.5. Можете ли вы поделиться с JUnit кодом с похожим scenerio, если у вас есть. Заранее спасибо :) –

0

Это может быть немного более многословие, чем вы надеялись, но вот тест, который мы используем. Mock используется для моделирования данных куратора, где мы хотим получить IP-адреса серверов Kafka, необходимых для маршрута Camel.

@Test 
public void testURIExtraction() throws Exception 
{ 
    //Create a mock curator to return mock kafka IP data 
    ExistsBuilder existsBuilder = Mockito.mock(ExistsBuilder.class); 
    when(existsBuilder.forPath(KAFKA_BASE_PATH)).thenReturn(new Stat()); 

    GetDataBuilder getDataBuilder = Mockito.mock(GetDataBuilder.class); 
    when(getDataBuilder.forPath(KAFKA_BASE_PATH)).thenReturn(_createMockData()); 

    CuratorFramework curatorFramework = Mockito.mock(CuratorFramework.class); 

    when(curatorFramework.checkExists()).thenReturn(existsBuilder); 
    when(curatorFramework.getData()).thenReturn(getDataBuilder); 

    //create a kafkaURIExtractor object and generate the trafficeEventEndpointURI 
    KafkaURIExtractor kafkaURIExtractor = new KafkaURIExtractor(); 
    kafkaURIExtractor.setBasePath(KAFKA_BASE_PATH); 
    kafkaURIExtractor.setKafkaZKPort("2181"); 
    kafkaURIExtractor.setCurator(curatorFramework); 

    kafkaURIExtractor.init(); 
    String trafficEventEndpoint = kafkaURIExtractor.getTrafficEventEndpointURI(); 

    Assert.assertEquals(EXPECTED_RESULT, trafficEventEndpoint); 
} 

private byte[] _createMockData() throws JSONException 
{ 
    JSONArray data = new JSONArray(); 
    JSONObject location = new JSONObject(); 
    JSONArray ips = new JSONArray(); 
    ips.put("127.0.0.1"); 
    location.put("cluster", "test-mojave_dev"); 
    location.put("ips", ips); 
    data.put(location); 
    return data.toString().getBytes(); 
} 

Это похоже на ваш пример в том смысле, что вызовы метода вложены. И.Е. для того, чтобы ссылаться на curatorFramework.getData().forPath(...) мы должны сначала обратиться curatorFramework.getData(), возвращая фиктивный объект ожидаемого типа, который в данном случае является GetDataBuilder.class

Объект KafkaURIExtractor просто проверяет, что KAFKA_BASE_PATH существует на куратором, а затем извлекает и форматирует данные, затем возвращает его с getTrafiicEventEndpointURI()