使用 any() 或 anyList() 时,使用 ArrayList/List 参数的存根方法失败



我有一个java类。

class Blah{
        public Blah(){
        }
        public String testMe(List<String> s){
            return new String("hello "+s.get(0));
        }

        public String testMeString(String s){
            return new String("hello "+s);
        }

    }

我无法尝试成功存根和测试 testMe 方法。请注意,我只是想理解java中的嘲笑。例如,我尝试过:

    @Test
    public void testTestMe(){
        Blah blah = spy(new Blah());
        ArrayList<String> l = new ArrayList<String>();
        l.add("oopsie");
        when(blah.testMe(Matchers.any())).thenReturn("intercepted");
        assertEquals("intercepted",blah.testMe(l));

这将返回一个 NullPointerException。我也尝试过any(List.class(,any(ArrayList.class(。我也尝试使用anyList()但这给了我一个IndexOutOfBounds错误。我做错了什么?有趣的是,我的testMeString工作正常。如果我这样做

@Test
    public void testTestMeString(){
        Blah blah = spy(new Blah());
        when(blah.testMeString(any())).thenReturn("intercepted");
        assertEquals("intercepted",blah.testMeString("lala"));
}

测试通过 any(( 和 any(String.class(。

这个语句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));
 }

您应该重新考虑使用 spymock 等。 当您有外部系统、REST 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。

您的 NullPointerException 是在存根期间抛出的,而不是在测试期间抛出的。

这是因为Matchers.any()实际上返回null,所以如果你在调用一个真正的方法时使用它,你会null作为参数传递。 testMeString恰好有效,因为null + s不会导致 NullPointerException(而是使用字符串"null"(。

而不是:

when(blah.testMe(any())).thenReturn("intercepted");

您需要使用

doReturn("intercepted").when(blah).testMe(any());

这被记录(尽管不可否认不是非常清楚(作为监视真实物体的重要陷阱!

相关内容

  • 没有找到相关文章

最新更新