方法中的Mockito模拟对象



我正在编写一项测试,以验证我从肥皂服务收到不同响应时的班级行为。我使用jaxb,所以我的响应包含 JaxbElements,对于其中许多人来说,我需要写一个模拟,这样:

JAXBElement<String> mock1 = mock(JAXBElement.class);
when(mock1.getValue()).thenReturn("a StringValue");
when(result.getSomeStringValue()).thenReturn(mock1);
JAXBElement<Integer> mock2 = mock(JAXBElement.class);
when(mock2.getValue()).thenReturn(new Integer(2));
when(result.getSomeIntValue()).thenReturn(mock2);
... <continue>

我想做的是以这种方式重构此代码:

when(result.getSomeStringValue())
    .thenReturn(mockWithValue(JAXBElement.class, "a StringValue");
when(result.getSomeIntValue())
    .thenReturn(mockWithValue(JAXBElement.class, 2));

并定义一种方法:

private <T> JAXBElement<T> mockWithValue(Class<JAXBElement> jaxbElementClass, T value) {
    JAXBElement<T> mock = mock(jaxbElementClass);
    when(mock.getValue()).thenReturn(value);
    return mock;
}

当我在重构之前执行代码时,一切正常工作。不幸的是,当我在重构后执行代码时,我会收到此错误:

org.mockito.exceptions.misusing.UnfinishedStubbingException: 
Unfinished stubbing detected here:
-> at com.mypackage.ResultConverterTest.shouldConvertASuccessfulResponseWithAllTheElements(ResultConverterTest.java:126)
E.g. thenReturn() may be missing.
Examples of correct stubbing:
when(mock.isOk()).thenReturn(true);
when(mock.isOk()).thenThrow(exception);
doThrow(exception).when(mock).someVoidMethod();
Hints:
  1. missing thenReturn()
  2. you are trying to stub a final method, you naughty developer!
  3: you are stubbing the behaviour of another mock inside before 'thenReturn' instruction if completed

其中126行是mockWithValue方法的第一个调用。

所以问题是:有没有办法重复使用相同的代码以创建许多具有相似行为的模拟?

在嘲笑时,当涉及一些其他仿制药参与时,最好选择doReturn()..when()语法:

    doReturn(mockWithValue(JAXBElement.class, "a StringValue"))
        .when(result).getSomeStringValue();
    doReturn(mockWithValue(JAXBElement.class, 2))
        .when(result).getSomeIntegerValue();

    private <T> JAXBElement<T> mockWithValue(Class<JAXBElement> jaxbElementClass, T value) {
        JAXBElement<T> mock = mock(jaxbElementClass);
        doReturn(value).when(mock).getValue();
        return mock;
    }

在创建响应时不应模拟。

让我在此代码中解释

private <T> JAXBElement<T> mockWithValue(Class<JAXBElement> jaxbElementClass, T value) {
    JAXBElement<T> mock = mock(jaxbElementClass);
    when(mock.getValue()).thenReturn(value);
    return mock;
}

您正在模拟JAXBElement<T> mock = mock(jaxbElementClass),然后您在return响应中使用了此完整的方法。

您应该首先创建这些响应,然后在return中使用它们。

String stringResponse=mockWithValue(JAXBElement.class, "a StringValue");
when(result.getSomeStringValue()).thenReturn(stringResponse);

尝试一下,它将起作用。

相关内容

  • 没有找到相关文章

最新更新