【问题标题】:Mockito verify the return of a spied object methodMockito 验证间谍对象方法的返回
【发布时间】:2013-06-06 16:38:38
【问题描述】:

我知道你可以验证一个间谍对象的方法被调用的时间。你能验证方法调用的结果吗?

类似于以下内容?

verify(spiedObject, didReturn(true)).doSomething();

【问题讨论】:

  • @BrianRoach 这个问题是关于间谍对象返回的值而不是传递给它的值

标签: java mockito


【解决方案1】:

要验证它被调用的次数,请使用verify(spiedObject, times(x)).doSomething()

您不应该验证从间谍对象返回的值。它不是被测对象,所以为什么要验证它返回的内容。而是验证被测对象的行为以响应间谍返回的值。

此外,如果您不知道间谍对象将返回什么值,最好使用模拟而不是间谍。

【讨论】:

  • 有时您想要验证返回值 - 例如,验证计算结果。或者,比如说,您正在监视一个传感器类,并且您想验证传感器在收到导致“警报”的输入类型时是否返回“警报”状态。
  • @luis.espinal 您的上述描述看起来像是对间谍对象的测试(验证警报输入时返回的警报)。这应该在对间谍对象的测试中完成,而不是在对使用间谍对象的对象的测试中完成。我还建议,如果返回警报结果背后有复杂的行为,您应该使用存根方法。
  • 啊,是的,你是对的,我误解了你的帖子。你绝对是正确的。
  • 我认为如果使用 Mockito 您可以验证传递给方法的值,您应该也可以验证结果。
【解决方案2】:

TL;DR
我正在为您想要验证 SpyBean 方法返回的测试提供一个模板。该模板正在使用 Spring Boot。

@SpringJUnitConfig(Application.class)
public class Test extends SpringBaseTest
{
    @SpyBean
    <replace_ClassToSpyOn> <replace_classToSpyOn>;

    @InjectMocks
    <replace_ClassUnderTest> <replace_classUnderTest>;

    // You might be explicit when instantiating your class under test.
    // @Before
    // public void setUp()
    // {
    //   <replace_classUnderTest> = new <replace_ClassUnderTest>(param_1, param_2, param_3);
    // }

    public static class ResultCaptor<T> implements Answer
    {
        private T result = null;
        public T getResult() {
            return result;
        }

        @Override
        public T answer(InvocationOnMock invocationOnMock) throws Throwable {
            result = (T) invocationOnMock.callRealMethod();
            return result;
        }
    }

    @org.junit.Test
    public void test_name()
    {
        // Given
        String expString = "String that the SpyBean should return.";
        // Replace the type in the ResultCaptor bellow from String to whatever your method returns.
        final Test.ResultCaptor<String> resultCaptor = new Test.ResultCaptor<>();
        doAnswer(resultCaptor).when(<replace_classToSpyOn>).<replace_methodOnSpyBean>(param_1, param_2);

        // When
        <replace_classUnderTest>.<replace_methodUnderTest>(param_1, param_2);

        // Then
        Assert.assertEquals("Error message when values don't match.", expString, resultCaptor.getResult());
    }
}

现在不碍事了。在某些情况下,您需要验证您的 SpyBean 是否正在返回结果值。例如,在您的测试方法中有两个内部方法调用会产生相同的值。两者都被调用,但只有其中一个产生了想要的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-26
    • 2011-12-17
    • 1970-01-01
    相关资源
    最近更新 更多