因为我刚开始Mockito,我有以下方法,我想测试。在我的YouTubeChannelImporter.java文件中,有两种方法: readJsonFromUrl(String url)和readAll(rd)
public JSONObject readJsonFromUrl(String url) throws IOException,
JSONException {
InputStream is = new URL(url).openStream();
try {
BufferedReader rd = new BufferedReader(new InputStreamReader(is,
Charset.forName("UTF-8")));
String jsonText = readAll(rd);
JSONObject json = new JSONObject(jsonText);
return json;
} finally {
is.close();
}
}
我从粗略的想法开始.Below是示例测试用例。
@Test
public void readJsonFromUrl() throws IOException, JSONException {
String urlTest="http://google.com/api";
YouTubeChannelImporter mockYoutube = mock(YouTubeChannelImporter.class);
YouTubeChannelImporter tubeChannelImporter =new YouTubeChannelImporter();
// URL url=new URL(urlTest);
// InputStream inputStream = mock(InputStream.class);
// when(url.openStream()).thenReturn(inputStream);
BufferedReader rd=mock(BufferedReader.class);
when(mockYoutube.readAll(rd)).thenReturn("{\"kind\":\"you\"}");
String jsonText="{\"kind\":\"you\"}";
JSONObject object=new JSONObject(jsonText);
assertEquals("{\"kind\":\"you\"}",tubeChannelImporter.readJsonFromUrl(urlTest).toString());
}
我的问题是,当我将测试函数readJsonFromUrl(String url)时,readAll(rd)不应该执行。相反,模拟应该在这里行动。我知道这个问题是因为 tubeChannelImporter.readJsonFromUrl(urlTest).toString()。寻找任何其他方式来实现我的目标。 感谢
答案 0 :(得分:0)
你正在嘲笑你班级的一个实例,然后再执行另一个 - 正如你所注意到的那样,这并没有达到预期的效果。
我认为测试方法的最简单方法是使用spy
ing("部分模拟")。使用这种技术,您只需使用一种方法readAll
嘲笑您的类的实际实例:
@Test
public void readJsonFromUrl() throws IOException, JSONException {
// Set up the spied instance:
YouTubeChannelImporter tubeChannelImporter = spy(new YouTubeChannelImporter());
doReturn("{\"kind\":\"you\"}").when(tubeChannelImporter).readAll(any(Reader.class));
// Test the execution
String urlTest="http://google.com/api";
String jsonText="{\"kind\":\"you\"}";
JSONObject object=new JSONObject(jsonText);
assertEquals("{\"kind\":\"you\"}",tubeChannelImporter.readJsonFromUrl(urlTest).toString());
}
答案 1 :(得分:0)
就个人而言,对于像这样的测试,你必须阅读一个文件并且没有其他的事情发生,我会读取一个实际的文件,而不是模拟出BufferedReader。然后,您只需要通过调用JSONObject
的{{1}}输出断言。
您的问题源于尝试针对readJsonFromUrl()
方法private
进行测试。尝试仅测试测试中的readAll()
方法(例如public
),您会发现必须在测试代码中跳过较少的箍。
如果您的班级已经实施了readJsonFromUrl()
,那么just write tests against the Interface。
如果你发现你有很多私人方法,也许你的班级是responsible for doing too much work,那么将方法分解到他们自己的类中。然后你可以单独测试它们。
如果你有一个maven项目,那么放置你的测试文件的地方就在Interface