3 回答
![?](http://img1.sycdn.imooc.com/533e4cde000148e602000200-100-100.jpg)
TA贡献1895条经验 获得超7个赞
通过将此语句blah.testMe()包含在 中when(),它会调用真正的方法:
when(blah.testMe(Matchers.any())).thenReturn("intercepted");
为避免这种情况,您应该使用doReturn(...).when(...).methodToInvoke()模式。
doReturn("intercepted").when(blah).testMe(Matchers.any()));
您注意到使用此语法:blah.testMe()语句未在任何地方指定。所以那不叫。
除了这个问题,我认为你不需要任何间谍来测试这个方法。
间谍是一种非常特殊的模拟工具,仅当您别无选择时才使用它:您需要模拟被测对象,这是一种不好的做法,并且您无法重构实际代码。
但在这里你可以这样做:
@Test
public void testTestMe(){
Blah blah = new Blah();
ArrayList<String> l = new ArrayList<String>();
l.add("oopsie");
assertEquals("hello oopsie",blah.testMe(l));
}
![?](http://img1.sycdn.imooc.com/545861b80001d27c02200220-100-100.jpg)
TA贡献1851条经验 获得超3个赞
您应该重新考虑 usingspy等mock。当您有外部系统、休息 web 服务、您不想在单元测试期间调用的数据库时,应该使用这些设施。在像这样的简单场景中,只需创建一些测试输入并检查输出。
@Test public void testTestMeString(){
//given
List<String> list = Arrays.asList("aaa");
//when
String result = blah.testMe(list);
//then
assertEquals(result, "hello aaa");
}
当您有兴趣时,given, when, then请检查 BDD。
![?](http://img1.sycdn.imooc.com/533e4c1500010baf02200220-100-100.jpg)
TA贡献1735条经验 获得超5个赞
您的 NullPointerException 在存根期间被抛出,而不是在测试期间。
这是因为Matchers.any()
实际上返回null
,所以如果您在调用真正的方法时使用它,您将null
作为参数传递。testMeString
恰好有效,因为null + s
不会导致 NullPointerException("null"
改为使用字符串)。
代替:
when(blah.testMe(any())).thenReturn("intercepted");
你需要使用
doReturn("intercepted").when(blah).testMe(any());
这被记录为(虽然承认不是非常清楚)作为间谍真实物体的重要陷阱!在 Mockito 文档中。
添加回答
举报