【发布时间】:2020-04-20 22:18:38
【问题描述】:
我有一个 Spring @RestController,它有一个 Apache Camel 接口 FluentProducerTemplate 的字段。
我正在使用 MockMvc 测试控制器,并且我正在注入 FluentProducerTemplate 作为模拟。
我只想模拟一种方法 - request(),并使用其他方法的真实实现。
但是,我从未模拟的方法中得到 NullPointerException。其他FluentProducerTemplate 方法,它们的返回类型是FluentProducerTemplate。在实现中,它们返回this。模拟对象返回 null。
- 我认为 mockito
@Mock只模拟我指定的方法。其他方法使用原始实现。这是正确的说法吗? - 我尝试了
@Spy而不是@Mock,但我得到了同样的错误。 - 当我模拟我使用的所有方法时,它都可以工作,而不是
NullPointerException。
代码:
REST 控制器:
@RestController
@RequestMapping("/v1/test”)
public class MyController {
@EndpointInject(uri = "direct:main")
private FluentProducerTemplate producerTemplate;
@RequestMapping(value = “/test2”, method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
public MyResponse testRequest(
@RequestHeader(“id”) String id,
@RequestHeader(“context”) String context,
@RequestBody RequestBody requestBody
) {
MyResponse response = producerTemplate
.withHeader(“id”, id)
.withHeader(“context”, context)
.withBody(requestBody)
.request(MyResponse.class);
return response;
}
测试:
@RunWith(MockitoJUnitRunner.class)
public class MyControllerTest {
private MockMvc mockMvc;
@Mock
private FluentProducerTemplate producerTemplateMock;
@InjectMocks
private MyControllerTest myController;
private static MyResponse expectedResultSuccess;
private static String requestString;
private static HttpHeaders allRequestHeaders;
@BeforeClass
public static void setup() {
allRequestHeaders = new HttpHeaders();
allRequestHeaders.set(“id”, “123”);
allRequestHeaders.set(“context”, “ABCD1234”);
allRequestHeaders.set(“Content-Type”, “application/json”);
expectedResultSuccess = new MyResponse(“test”);
requestString = “request”BodyText;
}
@Before
public void init() {
mockMvc = MockMvcBuilders.standaloneSetup(myController).build();
when(producerTemplateMock.request(any())).thenReturn(expectedResultSuccess);
}
@Test
public void testSuccess() throws Exception {
mockMvc.perform(post(“/v1/test/test2)
.headers(allRequestHeaders)
.content(requestString))
.andExpect(status().isOk())
}
}
只有当我将以下内容添加到init()时才能通过测试:
when(producerTemplateMock.withHeader(any(), any())).thenReturn(producerTemplateMock);
when(producerTemplateMock.withBody(any())).thenReturn(producerTemplateMock);
我的主要问题是 - 为什么我必须模拟所有方法?
我更喜欢使用withHeader() 和withBody() 的原始实现,并且只模拟request()。
【问题讨论】: