【问题标题】:How to mock POST parameters and Model attributes?如何模拟 POST 参数和模型属性?
【发布时间】:2015-12-07 13:29:49
【问题描述】:

我正在使用 Spring MVC 框架,我想用 JUnit 测试我的控制器。我应该如何模拟控制器的 POST 或 GET 参数以及如何访问模型的属性以检查其内容?我的控制器的签名如下:

@RequestMapping(value="/findings", method=RequestMethod.POST)
public String findUsers(@RequestParam("userInput") String userInput, Model m)

【问题讨论】:

  • 你在用spring-test吗?

标签: spring testing model-view-controller junit


【解决方案1】:

您可以使用spring-testmockito 以及junit 来完成任务。

spring-test 使您能够在 spring 中测试控制器和一大堆其他东西

mockito 是一个很棒的库,用于创建模拟类

这是对控制器进行单元测试的高级概述。这可能不适合您的情况,但应该给您一些起点。

public class SomeControllerTest {
    private SomeController controller;

    @Mock
    private View view;

    private MockMvc mockMvc;

    @Before
    public void setup(){
        MockitoAnnotations.initMocks(this);

        mockMvc = MockMvcBuilders
                .standaloneSetup(controller)
                .setSingleView(view)
                .build();
    }

    @Test
    public void test() throws Exception {
        ObjectMapper mapper = new ObjectMapper();

        Model m = new Model();

        MvcResult mvcResult = mockMvc.perform(post("/findings")
                .contentType(MediaType.APPLICATION_JSON)
                .content(objectMapper.writeValueAsString(m)))
        .andExpect(status().isOK())
        .andReturn();
    }
}

【讨论】:

  • 如何访问模型的属性以检查其内容是否符合预期?
  • 你的意思是如何检查控制器的响应?
  • 我想看看Model的属性值是否合适。该值即将显示在 .jsp 页面上,所以我想测试它是否正常工作
  • 如果我查看传入模型的方法,该值会发生什么变化?控制器的结果是一个字符串,通常你会检查字符串的值是否与给定特定模型的期望值匹配
【解决方案2】:

为此,我会向您推荐一个简单的测试,您可以在其中实例化您的控制器(您可以模拟所有依赖项),然后调用您的方法来传递模型。

public class MyController (){
  MyDependencyOne one;

  MyDependencyTwo two ;

  @Autowired
  public MyController (MyDependencyOne one, MyDependencyTwo two){
    this.one = one;
    this.two = two;
  }
  public String findUsers(@RequestParam("userInput") String userInput, Model 
  m){
      // do whatever
  }
}

public class MyControllerTest (){

  @Test
  public void myTest(){
      //MOCK your dependencies
      MyController controller = new MyController(one, two);
      Model model = new  ExtendedModelMap()
      controller.filter(model);
      assertEquals("yourAtribute", model.asMap().get("yourAtribute");
  }

}

【讨论】:

    猜你喜欢
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-03
    • 1970-01-01
    相关资源
    最近更新 更多