如何为使用注释@RequestParam的Spring MVC控制器创建单元测试?我已经为在handlerequest方法中使用HttpServletRequest对象的控制器创建了junit测试,但我正在寻找一种使用@RequestParam测试控制器的方法。
由于
@RequestMapping("/call.action")
public ModelAndView getDBRecords(@RequestParam("id") String id) {
Employee employee = service.retrieveEmployee(id);
}
答案 0 :(得分:11)
这种控制器风格的魅力之一是你的单元测试不需要担心请求映射的机制。他们可以直接测试目标代码,而不会混淆请求和响应对象。
因此,将单元测试编写为就像任何其他类一样,并忽略注释。换句话说,从测试中调用getDBRecords()
并传入id
参数。请记住,您不需要对Spring本身进行单元测试,您可以认为它有效。
还有另一类测试(“功能”或“接受”测试),一旦部署它就会对应用程序进行测试(例如使用WebDriver,Selenium,HtmlUnit等)。 此是测试您的映射注释正在执行此任务的地方。
答案 1 :(得分:0)
或者,你可以使用 _request = new MockHttpServletRequest();
和_request.setAttribute(“key”,“value”);
答案 2 :(得分:0)
使用集成测试(谷歌Spring MVC集成测试)
有点这个
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.IntegrationTest;
import org.springframework.boot.test.SpringApplicationContextLoader;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.context.WebApplicationContext;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = YourApplication.class, loader = SpringApplicationContextLoader.class)
@WebAppConfiguration
@IntegrationTest("server.port:0")
public class SampleControllerTest {
@Value("${local.server.port}")
protected int port;
@Autowired
protected WebApplicationContext context;
private RestTemplate restTemplate = new RestTemplate();
@Test
public void returnsValueFromDb() {
// you should run mock db before
String id = "a0972ca1-0870-42c0-a590-be441dca696f";
String url = "http://localhost:" + port + "/call.action?id=" + id;
ResponseEntity<String> response = restTemplate.getForEntity(url, String.class);
Assert.assertEquals(HttpStatus.OK, response.getStatusCode());
String body = response.getBody();
// your assertions here
}
}
答案 3 :(得分:0)
尝试将其作为测试方法!
@Test
public void testgetDBRecords(){
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
mockMvc.perform(get("/call.action?id=id1234").andExpect(status().isOk())
}