我需要澄清一下模拟测试。在我的特定场景中,我必须测试一个服务,它依赖于连接模块,连接器。基本上连接器的作用是,它创建了必须进行的服务调用的实例。我将在示例中进行演示。
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.
那么如何正确测试/嘲笑?一些代码示例会很棒。
答案 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"));
}
说明: -
答案 1 :(得分:1)
您还可以设置模拟以抛出异常,如果catch子句执行更多工作,这将非常有用。