模拟中的TestCase问题

时间:2014-07-22 06:12:15

标签: unit-testing mockito

因为我刚开始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()。寻找任何其他方式来实现我的目标。 感谢

2 个答案:

答案 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