繁体   English   中英

使用 Mockito 验证发送到未在模拟类中直接调用的方法的参数

[英]Verifying argument sent to method not invoked directly in mocked class using Mockito

我有一个类,我想在其中删除一个方法,但我想查看传递给该存根方法的参数。 但是,我不会在测试中直接调用该方法,而是调用最终会调用它的东西。 到目前为止,我发现的用于验证参数的示例仅适用于直接调用的方法。

这是一个说明问题的示例:

public class FooTest
{
    @Test
    public void testFoo()
    {
        Foo foo = mock(Foo.class);
        when(foo.mockableMethod(anyString())).thenReturn("dummy");

        foo.parentMethod(true);

        ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
        verify(foo).mockableMethod(captor.capture());
        assertEquals("foo", captor.getValue());
    }

    class Foo
    {
        public void parentMethod(boolean isFoo)
        {
            mockableMethod(isFoo ? "foo" : "bar");
        }

        protected String mockableMethod(String passedArgument)
        {
            // Only returning for brevity; assume it does a lot more.
            return passedArgument;
        }
    }
}

这会产生以下错误:

junit.framework.AssertionFailedError:
Wanted but not invoked:
foo.mockableMethod(<Capturing argument>);
-> at FooTest.testFoo(FooTest.java:32)

However, there were other interactions with this mock:
foo.parentMethod("foo");
-> at FooTest.testFoo(FooTest.java:29)

这甚至可能吗? 如果我验证parentMethod而不是mockableMethod ,则此设置工作得很好,但这对我来说不是很有用。 在这个例子中,我特别想确保如果使用true调用parentMethod则使用“foo”调用存根方法mockableMethod

我能想到的唯一选择是在testFoo做这样的事情:

when(foo.mockableMethod("foo")).thenReturn("dummy");

...但我不知道如何捕捉“foo”以外的参数被发送到它的情况。 thenThrow并失败? 欢迎提出建议!

spy可以像mock一样存根方法,切换到spy解决这个问题:

Foo foo = spy(new Foo());

其余代码保持不变。 然而,在我实际的代码,我需要使用doReturnwhen ,因为我不希望它被调用:

doReturn("dummy").when(foo).mockableMethod(anyString());

(由对原始问题的评论提供)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM