【问题标题】:How to send http request to mocked controller using MockMvc?如何使用 MockMvc 向模拟控制器发送 http 请求?
【发布时间】:2013-10-16 17:32:04
【问题描述】:

我有这门课要测试。此测试使用 mockMvc 对象。我认为这个对象发送 http 请求,这些请求处理控制器,其配置来自 pathToFile.xml

    @ContextConfiguration(locations = { "classpath:/pathToFile.xml" })
    @WebAppConfiguration
    @RunWith(SpringJUnit4ClassRunner.class)
    public class CandidateControllerTest {
        @Autowired
        WebApplicationContext wac;

        MockMvc mockMvc;

        @Before
        public void before() {
           mockMvc = MockMvcBuilders.webApplicationContextSetup(wac).build();

        }
...
}

我认为有时我想将控制器与其他配置一起使用。

什么意思?

CandidateControllerTest 测试CandidateController 类的方法

@Controller
CandidateController{

   @Autowire
   CandidateService candidateService;

   @RequestMapping("/path")
   public string handleSomething(Model model){
    ...
      candidateService.doSomething();
    ...
      return "viewName"

   }

}

我想模拟 candidateService 发送的 http 请求到控制器,模拟 candidateService

真的吗?

【问题讨论】:

    标签: java spring testing spring-mvc mocking


    【解决方案1】:

    CandidateController 类中为candidateService 创建一个setter。

    在您的CandidateControllerTest 中,从WebApplicationContext 获取CandidateController bean 并使用setter 设置模拟。

    CandidateService candidateServiceMock = ...; // mock it
    CandidateController cc = (CandidateController) wac.getBean(CandidateController.class);
    cc.setCandidateService(candidateServiceMock);
    

    我不推荐这个。如果您只是简单地测试CandidateController 自己,这很好。但是您在 MockMvc 后面测试它,这是集成测试。模拟不属于正在测试的堆栈。

    【讨论】:

    • CandidateService 将在每次测试后重置?
    • @homeAccount 您可以选择是否愿意。使用模拟我可能会在每次测试后重置它。
    • Sotirios Delimanolis,它真的是为 Model、RedirecAttributes 和 ModelAttributes 制作类似的技巧(春季作品)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-08
    • 1970-01-01
    • 1970-01-01
    • 2013-10-24
    • 2018-11-26
    • 2016-05-17
    • 2014-03-07
    相关资源
    最近更新 更多