gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 18:33:16 26 4
gpt4 key购买 nike

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

下面是一个说明问题的示例:

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”调用 stub 方法 mockableMethod

我能想到的唯一替代方法是在 testFoo 中执行类似的操作:

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

...但我不确定如何捕获向其发送“foo”以外的参数的情况。 thenThrow 结果失败了?欢迎提出建议!

最佳答案

spy 可以像 mock 一样对方法进行 stub ,并且切换到 spy 可以修复该问题:

Foo foo = spy(new Foo());

其余代码保持不变。但是,在我的实际代码中,我需要在when之前使用doReturn,因为我不想调用它:

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

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

关于java - 使用 Mockito 验证发送到未在模拟类中直接调用的方法的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60122192/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com