我有以下REST控制器
@Controller
@RequestMapping("/rest/transceptors")
public class TransceptorRestController
{
@Autowired
private TransceptorDao transceptorDao;
@RequestMapping(value="/get/{idTransceptor}", method=RequestMethod.GET)
public @ResponseBody Transceptor getOne(@PathVariable("idTransceptor") Long idTransceptor)
{
return transceptorDao.searchByIdTransceptor(idTransceptor);
}
}
在JBoss中运行时,此控制器可正常工作,结果与预期一致。我使用Postman(Google Chrome的REST测试扩展),我可以在XML和JSON中获得正确的结果。
但是,我在使用MockMVC进行测试时遇到了问题。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(
locations={
"classpath:test-servlet-context.xml"
})
@WebAppConfiguration
public class TransceptorRestControllerTest {
@Autowired
private WebApplicationContext wac;
private MockMvc mockMvc;
@Before
public void setup()
{
mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
}
@Test
public void testRoot() throws Exception
{
mockMvc.perform(get("/")).
andExpect(status().isOk());
}
@Test
public void testGet() throws Exception
{
mockMvc.perform(get("/rest/transceptors/get/1"))
.andExpect(status().isOk())
.andDo(print())
.andExpect(model().attribute("name", equals("Test_Name_1")));
}
TestRoot测试工作正常。但是,当我尝试使用andExpect(model()...我收到消息“No ModelAndView Found”
当替换model()部分以满足对XML或JSON的特定期望时,XML和JSON字符串始终返回空。
我花了几天时间试图理解这一点,而且我对Java很新,而且对Spring更新。你能告诉我在哪里可以解决这个问题吗?
作为adittional信息,我已经将日志消息(使用sfj4l)放在任何地方,但是当使用Junit运行时,DAO中的日志消息可用,测试模块中的日志消息本身可以正常工作,但是我的REST控制器中的日志消息没有出现。
就像GET函数匹配一样,但函数的内容永远不会被执行,并且会得到空的响应。尽管如此,我对isOk()的调用也是成功的。
答案 0 :(得分:0)
“No ModelAndView Found”是对的。使用@ResponseBody,返回的值将直接写入响应的主体。没有模型,没有视图分辨率等。
更一般地说,理想的重点是从客户的角度测试请求的结果。这包括响应标头,正文和响应状态。测试通常对客户端不可见的其他结果,例如模型属性更加谨慎。
答案 1 :(得分:0)
我和你的问题几乎完全相同,似乎找到了导致问题的原因。
我在下面的一条评论中解释了我的情况,但这应该更完整。
我正在使用Spring Roo 1.2.4,Spring 3.2.3。当我运行我的应用程序时,我可以卷曲所有控制器,所有这些都可以正常工作。但是,我的一个控制器在mockmvc测试中返回空json,没有抛出任何错误。
我在Roo生成的AspectJ控制器代码(那些说你不应该编辑它们的文件)中发现了尝试捕获问题的问题,并发现序列化代码(.toJsonArray)失败并带有
org.hibernate.LazyInitializationException: failed to lazily initialize a collection...
被静默忽略,并且没有自动喷出堆栈跟踪。