【问题标题】:MockRestServiceServer & java.lang.IllegalArgumentException: No InputStream specifiedMockRestServiceServer & java.lang.IllegalArgumentException:未指定 InputStream
【发布时间】:2013-11-10 03:32:03
【问题描述】:

我正在尝试在客户端测试我的 REST 服务(在服务器端调用 Spring MVC)。

我可以使用 PostMan 在服务器端使用 Json 访问 url,一切都很好,所以我知道服务器端是正确的。

服务器端MVC方法: ​​​ 代码:

@RequestMapping(value = "/device/event/{type}", method = RequestMethod.POST)
@ResponseStatus(value = HttpStatus.OK)
public void processEvent(@PathVariable String type,
                @RequestBody DeviceEvent event) throws Exception {
    log.info("Device Event["+type+"] generated by Device["+event.getDeviceAddress()+"] ");

    if (StringUtils.isBlank(type) || event == null || 
        StringUtils.isBlank(event.getDeviceAddress()) || 
        StringUtils.isBlank(event.getDeviceType())) {
        return;
    }

    deviceEventHandlers.get(type).handleEvent(event);      
}

客户端方法: 代码:

public void newNodeEvent(DeviceEvent event) {
    final String apiUrl = eventRepository + "/" + DeviceEventType.DEVICE_NEW.getCode();
    this.sendEvent(event, apiUrl);
}

@Async
private void sendEvent(final DeviceEvent event, final String apiUrl) {
    try {
        ResponseEntity<String> response = restTemplate.postForEntity(new URI(apiUrl), event,
                        String.class);
        HttpStatus status = response.getStatusCode();
        if (status.value() != HttpStatus.OK.value()) {
            log.error("Event Controller returned with status code[" + status.value()
                            + "] for [" + apiUrl + "]");
        }
    }
    catch (ResourceAccessException | URISyntaxException ex) {
        log.error("Cannot connect to Event Controller, for [" + apiUrl + "]");
    }
}

测试类: 代码:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { AnnotationConfigContextLoader.class, MockRestConfig.class })
public class DeviceEventServiceTest {

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private IDeviceEventService deviceEventService;

    @Value("${event.repository.path}")
    private String eventRepository;

    private MockRestServiceServer mockServer;

    @Before
    public void setUp() throws Exception {
        mockServer = MockRestServiceServer.createServer(restTemplate);
    }

    @Test
    public void testNewNodeEventTriggered() throws JsonGenerationException, 
            JsonMappingException, IOException, URISyntaxException {
        DeviceEvent de = new DeviceEvent();
        de.setHubId(123);
        de.setDeviceAddress("1234567890abcdef");
        de.setSwVersion("1.0-1");
        de.setHwVersion("1.0-1");
        de.setDeviceType(DeviceType.WIRELESS_VALVE.getCode());

        String expectedContent = JsonConverter.objectToJsonString(de, true);

        mockServer.expect(requestTo(new URI(eventRepository + "/DNW")))
            .andExpect(method(HttpMethod.POST))
            .andExpect(content().contentType(JsonConverter.APPLICATION_JSON_UTF8))
            .andExpect(content().string(expectedContent))
            .andRespond(withSuccess());

        deviceEventService.newNodeEvent(de);
        mockServer.verify();
        assertTrue(true);
    }

}

客户端代码 100% 工作,但测试失败: java.lang.IllegalArgumentException: 没有指定 InputStream

任何帮助将不胜感激,因为我已经花了很多时间在这方面

【问题讨论】:

    标签: spring unit-testing


    【解决方案1】:

    请试试这个:

    mockServer.expect(requestTo(new URI(eventRepository + "/DNW"))).andExpect(method(HttpMethod.POST)) 
       .andExpect(content().contentType(JsonConverter.APPLICATION_JSON_UTF8))                
       .andExpect(content().string(expectedContent))
       .andRespond(withStatus(HttpStatus.OK).body(new byte[0]));
    

    与您的相比发生了什么变化:

    ... .andRespond(withSuccess()); // Yours
    ... .andRespond(withStatus(HttpStatus.OK).body(new byte[0])); // Suggested fix
    

    【讨论】:

      猜你喜欢
      • 2015-11-23
      • 1970-01-01
      • 1970-01-01
      • 2017-05-13
      • 2016-01-26
      • 2012-03-29
      • 2017-02-03
      • 1970-01-01
      • 2014-10-25
      相关资源
      最近更新 更多