3

我有以下 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”

当为 XML 或 JSON 的特定期望替换 model() 部分时,XML 和 JSON 字符串始终返回空。

我花了几天时间试图理解这一点,而且我对 Java 还是比较陌生,对 Spring 还是比较陌生。你能告诉我在哪里可以解决这个问题吗?

作为附加信息,我已将日志消息(使用 sfj4l)放在任何地方,但是当使用 Junit 运行时,DAO 中的日志消息有效,测试模块中的日志消息本身有效,但我的 REST 控制器内的日志消息没有出现.

就像 GET 函数被匹配了,但是函数的内容从不执行,并且得到空响应。尽管如此,我对 isOk() 的调用还是成功的。

4

2 回答 2

0

我的问题与您的问题几乎相同,并且似乎找到了导致问题的原因。

我在下面的评论之一中解释了我的情况,但这应该更完整。

我正在使用 Spring Roo 1.2.4、Spring 3.2.3。当我运行我的应用程序时,我可以卷曲所有控制器并且它们都工作得很好。但是,我的一个控制器在 mockmvc 测试中返回空 json,没有抛出错误。

我在 Roo 生成的 AspectJ 控制器代码(那些说你不应该编辑它们的文件)中发现了尝试捕获问题的问题,并发现序列化代码(.toJsonArray)失败了

org.hibernate.LazyInitializationException: failed to lazily initialize a collection...

它会被默默地忽略,并且不会自动喷出任何堆栈跟踪。

于 2013-11-05T11:30:56.927 回答
0

“未找到 ModelAndView”是对的。使用@ResponseBody,返回值直接写入响应正文。没有模型,没有视图分辨率等。

更一般地说,理想情况下,专注于从客户端的角度测试请求的结果。这包括响应标头、正文和响应状态。测试其他通常对客户端不可见的结果,例如更谨慎地测试模型属性。

于 2013-03-28T13:15:37.513 回答