模拟测试澄清

时间:2016-11-15 19:19:59

标签: java unit-testing mocking mockito

我需要澄清一下模拟测试。在我的特定场景中,我必须测试一个服务,它依赖于连接模块,连接器。基本上连接器的作用是,它创建了必须进行的服务调用的实例。我将在示例中进行演示。

public DataService(Connector connector) {
    this.connector = connector;
}

@Override
public ServiceData getWeatherData(String dataId) throws ServiceCommunicatonException {

    try {

        return connector.newGetWeatherDataCall().call(
                WeatherData.builder().withId(dataId).build());

    } catch (Exception e) {
        throw new ServiceCommunicatonException(ERR_MSG);
    }

}

因此connector.newGetWeatherDataCall()会返回WeatherData类型的实例。

现在,为了测试Service,我想我需要模拟Connector。嘲弄Service可能毫无意义,因为那时我并没有真正测试它,对吧?

我尝试用这样的东西嘲笑Connector

@Before
public void setUp() {
    connector = mock(Connector.class);
}

@Test
public void getDataTest() {
    assertNotNull(service.getData("123"));
}

然而,这显然是错误的,因为这给了ma NullPointerException,因为WeatherDataCall来自这一行:return

connector.newGetWeatherDataCall().call(
                    WeatherData.builder().withId(dataId).build()); was null. 

那么如何正确测试/嘲笑?一些代码示例会很棒。

2 个答案:

答案 0 :(得分:2)

@Test
public void getDataTest() {
    WeatherData getWeatherDataResponse = Mockito.mock(WeatherData.class);
    when(connector.newGetWeatherDataCall()).thenReturn(getWeatherDataResponse);
    when(getWeatherDataResponse.call(Matchers.any(Class.class))).thenReturn(new ServiceData());
    assertNotNull(service.getData("123"));
}

说明: -

  • 由于未设置预期的返回值,因此为空。实际上connector.newGetWeatherDataCall()返回null。这是因为您没有使用Mockito.when()来返回预期结果。
  • 第二:在您的情况下,调用此返回值的方法,因此connector.newGetWeatherDataCall()应返回WeatherData的模拟。现在,您将设置对WeatherData.call(..)的期望,它将是ServiceData类型。

答案 1 :(得分:1)

您还可以设置模拟以抛出异常,如果catch子句执行更多工作,这将非常有用。