java - 将查询参数传递给 TestRestTemplate

标签 java spring-boot integration-testing

您好,我正在使用 TestRestTemplate 为我的代码实现一些集成测试,在尝试测试端点时我找不到包含查询参数的方法。

这是我尝试过的 2 种不同的测试:

@Test
@DisplayName("Test list all filtered by boolean field")
void testListAllBooleanFilter() {
    Map<String, String> params = new HashMap<>();
    params.put("page", "0");
    params.put("size", "5");
    params.put("filters", "active=true");
    ResponseEntity<AdminDTO[]> response = this.testRestTemplate.getForEntity("/api/v1/admin", AdminDTO[].class,
            params);
    assertThat(response.getBody()).isNotNull();
    assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
    assertThat(response.getBody()).hasSize(2);
    assertThat(response.getBody()[0].getActive()).isTrue();
    assertThat(response.getBody()[1].getActive()).isTrue();
}

@Test
@DisplayName("Test list all with empty result")
void testListAllEmptyResult() {
    HttpEntity<String> requestEntity = new HttpEntity<>(new HttpHeaders());
    Map<String, String> params = new HashMap<>();
    params.put("page", "0");
    params.put("size", "5");
    params.put("filters", "active=false");
    ResponseEntity<List> response = this.testRestTemplate.exchange("/api/v1/admin", HttpMethod.GET,
            requestEntity, List.class, params);
    assertThat(response.getBody()).isNotNull();
    assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
    assertThat(response.getBody()).isEmpty();
}

这是我正在测试的 Controller :

@GetMapping(value = "/admin", produces = "application/json")
public ResponseEntity listAll(String filters, Pageable pageable) {
    if(filters ==  null) {
        filters = "type=" + ADMIN.toString();
    } else {
        filters += ",type=" + ADMIN.toString();
    }
    Condition condition = filterMapService.mapFilterToCondition("user_account", filters);
    List<AdminDTO> adminAccounts = userAccountRepository.findAllByFilter(condition, pageable);
    if (adminAccounts.isEmpty()) {
        return new ResponseEntity<>(adminAccounts, HttpStatus.OK);
    }
    return new ResponseEntity<>(adminAccounts, HttpStatus.OK);
}

基本上,当我调试代码时,每当请求到达端点时,我尝试通过测试发送的参数不知何故为空,因此过滤器为 null 并且 Pageable 我猜使用默认值,因为它设置它们到 page=0size=20。我尝试使用 .exchange(...).getForEntity(...).getForObject(...) 方法TestRestTemplate 类,但似乎没有一个与查询参数一起工作,有人可以帮助我并告诉我我可能做错了什么,我真的很感激!

最佳答案

看起来你的问题是你没有在你的 URL 中包含参数。它应该是这样的:

    /api/v1/admin?page={page}&size={size}&filters={filters} 

请在下面找到link一些例子以防万一它可以帮助你

关于java - 将查询参数传递给 TestRestTemplate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46892516/

相关文章:

java - Spring boot slf4j/log4j 禁用每日 RollingFilePolicy

java - 在 JPOS 中放置自定义逻辑的正确位置是什么?

java - 为什么此 PrintWriter 不填充此文件?

java - 当我调用 repaint() 时,Paint() 方法未执行

java - 如何在 Hibernate 中初始化集合的集合

java - 使用 Azure 目录进行身份验证并从数据库中获取有效的用户角色

python - 在测试序列中的测试之间保存数据的模式

java - 如何在 docker 测试容器中添加运行参数

integration-testing - 如何在 Cypress 中获取多个别名的值而不引入回调 hell ?

java - 为什么 JNI 调用本地方法比 sun.misc.Unsafe 中的类似方法慢?