【问题标题】:Spring MockMvc - request parameter listSpring MockMvc - 请求参数列表
【发布时间】:2017-07-11 20:34:49
【问题描述】:

我正在尝试使用 MockMvc 测试几个控制器端点,但遇到了一些麻烦(请客气,我是新手……)。使用字符串作为参数的简单端点工作正常,但是使用字符串列表的稍微复杂的端点不满意并引发异常;谁能指出我做错了什么?

@RestController
@RequestMapping("/bleh")
public class Controller
{
    @Autowired
    private DataService dataService

    @RequestMapping(value = "/simple", method = RequestMethod.GET)
    public String simple(String name) 
    { 
        return dataService.getSomeData(name) 
    }

    @RequestMapping(value = "/complicated", method = RequestMethod.GET)
    public String complex(List<String> names)
    { 
        return dataService.getSomeOtherData(names) 
    }
}

-

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class HealthControllerTests extends Specification
{
    def dataServiceMock;
    def testController;
    def mockMvc;


    def setup(){
        dataServiceMock = Mock(DataService)
        dataServiceMock.getSomeData >> "blaah"
        testController = new Controller(dataService: dataServiceMock)
        mockMvc = MockMvcBuilders.standaloneSetup(testController).build();
    }

    def "working test"
        when:
        def response = MockMvc.perform(get("/simple").param("name", "tim"))
                .andReturn()
                .getResponse();

        then:
        response.status == OK.value();
        response.contentAsString == "blaah"

    def "unhappy test"
        when:
        def response = MockMvc.perform(get("/complicated").param("names", new ArrayList<>()))
            .andReturn()
            .getResponse();

        then:
        response.status == OK.value()


}

抛出这个:

No signature of method: org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder.param() is applicable for argument types: (java.lang.String, java.util.ArrayList) values: [names, []]. Possible solutions: param(java.lang.String, [Ljava.lang.String;), params(org.springframework.util.MultiValueMap), wait(), grep(), any(), putAt(java.lang.String, java.lang.Object)])

【问题讨论】:

    标签: java spring spring-mvc


    【解决方案1】:

    ArrayList 不受支持,但您可以执行以下操作

    def "complicated test"
        when:
        def response = MockMvc.perform(get("/complicated").param("names", "bob", "margret"))
            .andReturn()
            .getResponse();
    
        then:
        response.status == OK.value()
    
    def "another complicated test"
            when:
            def response = MockMvc.perform(get("/complicated").param("names", new String[]{"bob", "margret"}))
                .andReturn()
                .getResponse();
    
            then:
            response.status == OK.value()
    

    【讨论】:

      【解决方案2】:

      使用方法params() 而不是param() 它支持多值映射,因此您可以拥有一个键的值列表。

      例如

          List<String> values = Arrays.asList("foo", "bar", "baz");
          MultiValueMap<String, String> params = new LinkedMultiValueMap<>()
          params.addAll("myKey", values);
      
          MockMvc.perform(get("/complicated")
                  .params(params)
                  .andReturn()
                  .getResponse();
      

      【讨论】:

        猜你喜欢
        • 2014-02-06
        • 2019-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多