Spring MVC测试框架 - JSON端点仅在测试中返回406。
Spring MVC测试框架 - JSON端点仅在测试中返回406。
我已经构建了一个使用Hibernate和JPA的工作Spring MVC Web应用程序,它具有一个单一的端点,当通过Web浏览器调用时,成功返回JSON。我还编写了一些行为测试,使用Spring MVC测试框架来测试包含所有工作部分(配置、控制器、服务、模型和存储库)的JSON端点。我已经成功设置了一个测试,使用我的应用程序配置,将各个组件注入/自动装配在一起,然后对我的端点进行'GET'请求。我可以调试这些调用,从命中控制器端点开始,经过服务进入存储库,成功获取数据并返回正确的模型对象。然而,控制器返回一个406不可接受的响应,测试失败。我花了两天时间来解决这个问题,并阅读了几乎所有的博客文章和SO答案,但没有找到有效的建议。以下是我的控制器:
@Controller
public class DataController {
@Autowired
private IService service;
@RequestMapping(
value = "/data",
method = RequestMethod.GET,
produces = "application/json"
)
public @ResponseBody
ModelData getDataByCode(@RequestParam String code) {
return service.getDataCode(code);
}
}
服务:
@Service("dataService")
public class DataService implements IService {
@Autowired
private IDataRepository dataRepository;
@Transactional
public ModelData getDataByCode(String code){
return dataRepository.getDataByCode(code);
}
}
存储库:
@Repository("dataRepository")
public class DataRepository implements IDataRepository {
@PersistenceContext
private EntityManager entityManager;
public ModelData getDataByCode(String code) throws IllegalStateException, PersistenceException {
String selectJPAQueryBase = "Select data from ModelData data where data.code = %s";
Query query = entityManager.createQuery(String.format(selectJPAQueryBase, code));
return (ModelData) query.getSingleResult();
}
}
与核心功能相关的依赖关系:
JPA上下文:
Web.xml:
Servlet配置:
失败的测试:
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration("classpath:jpaContext.xml")
public class GetDataCodeIntTest {
@Autowired
private WebApplicationContext webApplicationContext;
private MockMvc mockMvc;
@Before
public void setup() {
this.mockMvc = MockMvcBuilders.webAppContextSetup(this.webApplicationContext).build();
}
@Test
public void getDataByCode() throws Exception {
String code = "1234";
this.mockMvc.perform(MockMvcRequestBuilders.get("/data").param("code", code))
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.content().contentType(MediaType.APPLICATION_JSON))
.andExpect(MockMvcResultMatchers.jsonPath("$.code").value(code));
}
}
关键问题在于应用程序在浏览器中完全正常工作,但在控制器返回响应的地方使用Spring MVC测试框架失败。
问题出现的原因是测试中缺少了spring-context.xml配置。
解决方法是通过添加spring-context.xml配置文件来进行测试。
具体操作如下:
1. 将spring-context.xml文件添加到测试资源目录下。
2. 在测试类中使用@ContextConfiguration注解来指定spring-context.xml的位置。
示例代码如下:
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"classpath:spring-context.xml"}) public class MyTest { @Autowired private MyController myController; @Test public void test() { // 测试代码 } }
这样就可以解决测试中JSON接口返回406的问题了。