【发布时间】:2018-12-07 10:43:16
【问题描述】:
出于学校目的,我正在创建一个使用股票 API 的应用程序。
我正在尝试为获取过去 10 年所有股票数据的方法编写测试。我不想真正获取所有数据,而是想抛出一个异常。
我要测试的方法:
@Override
public List<StockData> getAllTeslaStockData() throws AlphaVantageException {
List<StockData> stockData;
AlphaVantageConnector apiConnector = new AlphaVantageConnector(APIKEY, TIMEOUT);
TimeSeries stockTimeSeries = new TimeSeries(apiConnector);
try {
Daily responseDaily = stockTimeSeries.daily("TSLA", OutputSize.FULL);
stockData = responseDaily.getStockData();
} catch (AlphaVantageException e) {
LOGGER.log(Level.SEVERE, "something went wrong: ", e);
throw e;
}
return stockData;
}
stockTimeSeries.daily(....) 调用会抛出 AlphaVantageException。
我已经像这样嘲笑 TimeSeries 类:
TimeSeries stockTimeSeries = mock(TimeSeries.class);
在我的测试类中,我想模拟这个调用,并返回一个异常而不是实际数据。
when(stockTimeSeries.daily("TSLA", OutputSize.FULL)).thenThrow(new AlphaVantageException("No stock data available"));
无论我如何尝试模拟这段代码,它都不会抛出异常。它总是只执行代码,并返回有效的股票数据,而不是像我试图做的那样抛出异常。
我如何模拟这段代码,以便它会抛出我期望的测试异常。
AlphaVantageConnector、TimeSeries 和 Daily 类是用于访问 stock API 的库的一部分,因此我无法更改这些类。
我正在使用 JUnit 4.12 和 Mockito 来尝试实现这一目标。
【问题讨论】:
-
您是否模拟了实例本身的创建 (new TimeSeries(apiConnector);) 并为其分配了模拟引用“stockTimeSeries”? TimeSeries stockTimeSeries = new TimeSeries(apiConnector);
-
据我所知,mockito 不允许模拟构造函数,如果我错了,请纠正我@AnkurChrungoo
-
如果你愿意,还有其他方法可以模拟构造函数。但是,我的问题与您如何期望 Mockito 将“stockTimeSeries”识别为该方法应使用的模拟引用更相关。该方法正在创建自己的实例并使用它,因此每次它都会调用实际方法而不是使用模拟对象。
-
一个简单的例子就是创建一个方法(在你的类中)返回 TimeSeries 对象,然后在你的 Junit 中模拟该方法。
标签: java unit-testing junit mocking mockito