gpt4 book ai didi

java - 方法内的 Mockito 模拟对象

转载 作者:行者123 更新时间:2023-11-30 07:51:51 27 4
gpt4 key购买 nike

我正在编写一个测试来验证我的类在收到来自 SOAP 服务的不同响应时的行为。我使用 Jaxb,所以我的响应包含 JaxbElements,对于其中的许多,我需要编写一个 mock,如下所示:

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;
}

关于java - 方法内的 Mockito 模拟对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46423904/

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