如何模拟POST参数和模型属性?

时间:2015-12-07 13:29:49

标签: spring testing model-view-controller junit

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

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

2 个答案:

答案 0 :(得分:1)

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

spring-test使您可以在春季测试控制器和一大堆其他东西

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();
    }
}

答案 1 :(得分:0)

为了做到这一点,我会建议你进行一个简单的测试,你可以在其中实现你的Controller(你可以模拟所有的依赖项),之后你可以调用你的方法来模拟。

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");
  }

}