Spring 3.2.2:MockMVC,返回Empty结果

时间:2013-03-25 14:56:58

标签: spring testing junit modelandview

我有以下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()的调用也是成功的。

2 个答案:

答案 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...

被静默忽略,并且没有自动喷出堆栈跟踪。