【问题标题】:404 error when testing method with RestTemplate使用 RestTemplate 测试方法时出现 404 错误
【发布时间】:2018-01-15 14:42:59
【问题描述】:

我正在尝试为使用 RestTemplate 下载文件的方法运行单元测试。我已经关注了多个主题的主题,但与它们相反,当我运行测试时出现 404 错误。

这是我的方法:

@Api(value = "Telecharger fichier sas")
@RestController
@RequestMapping(PUBLIC_BASE_URL)
public class TelechargerFichierRestController extends BaseController {

    /** Size of a byte buffer to read/write file */    
    private static final int BUFFER_SIZE = 4096;

    /**Header name */
    private static final String HEADER_NAME = "REMOTE_USER";


    /**
     * Telecharger fichier dans le répertoire download
     * 
     * @param request
     * @param response
     * @throws Exception
     */
    @ApiOperation(value = "Telecharger fichier dans le répertoire download")
    @RequestMapping(value = "/sasDl/download", method = RequestMethod.GET)
    public void downloadFichier(final HttpServletRequest request,
            final HttpServletResponse response) throws IOException {

        InputStream inputStream = null;
        int bytesRead;
        RestTemplate template = new RestTemplate();

        // initialisation de headers
        HttpHeaders headers = new HttpHeaders();
        String remoteUser = request.getHeader(HEADER_NAME);
        headers.add(HEADER_NAME, remoteUser);
        HttpEntity<String> entity = new HttpEntity<String>("parameters", headers);

        // recupération de ressource depuis psas_m
        ResponseEntity<Resource> result = template.exchange(PSASConfig.PREFIX_URL_API_PSAS, HttpMethod.GET, entity,
                Resource.class);
        // get output stream of the response
        OutputStream outStream = response.getOutputStream();

        try {
            inputStream = result.getBody().getInputStream();

        } catch (IOException e) {
            throw new IOException(e);
        }

        byte[] buffer = new byte[BUFFER_SIZE];

        // write bytes read from the input stream into the output stream
        while ((bytesRead = inputStream.read(buffer)) != -1) {
            outStream.write(buffer, 0, bytesRead);
        }

        inputStream.close();
        outStream.close();
    }

}

这是测试:

@RunWith(MockitoJUnitRunner.class)
public class TelechargerFichierRestTest {


    @Mock
    private HttpServletRequest request;

    @Mock
    private HttpServletResponse response;

    @Mock
    private RestTemplate mockRestTemplate;
    /**
     * RestController
     */
    @InjectMocks
    private TelechargerFichierRestController restController


    /**
     * Test method for {@link fr.cnamts.brrsm.services.app.majRequeteSAS.service.impl#DownloadFichier()}.
     * 
     * @throws Exception
     */
    @Test
    public void testDownloadFichier() throws Exception {
        Mockito.doReturn(new ResponseEntity<Resource>(HttpStatus.ACCEPTED))
            .when(mockRestTemplate)
            .exchange(ArgumentMatchers.anyString(),
                ArgumentMatchers.any(HttpMethod.class),
                ArgumentMatchers.<HttpEntity<String>> any(),
                ArgumentMatchers.<Class<String>> any(),
                ArgumentMatchers.<Object>anyVararg());
        restController.downloadFichier(request, response);
        Mockito.verify(response).getOutputStream();
        Mockito.verify(request).getHeader("REMOTE_USER");

    }

}

谁能告诉我为什么答案是 404,以及如何避免它?谢谢。

【问题讨论】:

  • catch (IOException e) { throw new IOException(e); } 这没有任何意义,因为您只使用相同执行类的对象包装异常。删除 ry catch 块

标签: java rest unit-testing junit resttemplate


【解决方案1】:

你在嘲笑 RestTemplate 的 5-arg 方法

Mockito.doReturn(new ResponseEntity<Resource>(HttpStatus.ACCEPTED)).when(mockRestTemplate)
.exchange(ArgumentMatchers.anyString(), ArgumentMatchers.any(HttpMethod.class), ArgumentMatchers.<HttpEntity<String>> any(), ArgumentMatchers.<Class<String>> any(), ArgumentMatchers.<Object>anyVararg());

但测试 4-arg 方法

template
.exchange(PSASConfig.PREFIX_URL_API_PSAS, HttpMethod.GET, entity, Resource.class);

【讨论】:

  • 是的,对不起,我从另一个主题尝试过这个。但是我在 doReturn().when() 中只测试了 4 个参数,它返回相同的 404 错误。
  • 代码中的另一个问题是,在测试中您模拟了 RestTemplate 类的注入 bean,但在实际代码中,您在每个请求上构造了 RestTemplate 的新实例。所以尝试将 RestTemplate 作为托管 bean 自动连接到您的控制器中
猜你喜欢
  • 1970-01-01
  • 2014-04-30
  • 2020-07-31
  • 2017-10-28
  • 1970-01-01
  • 2021-01-12
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
相关资源
最近更新 更多