[英]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());
其余代码保持不变。 然而,在我实际的代码,我需要使用doReturn
前when
,因为我不希望它被调用:
doReturn("dummy").when(foo).mockableMethod(anyString());
(由对原始问题的评论提供)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.