Spring MVC测试框架 - JSON端点仅在测试中返回406。

19 浏览
0 Comments

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();
}
}
与核心功能相关的依赖关系:

org.springframework
spring-webmvc
3.2.14.RELEASE


javax.servlet
servlet-api
2.5
provided


javax.servlet
jstl
1.2
provided


com.fasterxml.jackson.core
jackson-core
2.6.2


com.fasterxml.jackson.core
jackson-databind
2.6.2


com.fasterxml.jackson.core
jackson-annotations
2.6.2


org.springframework
spring-oxm
3.2.14.RELEASE


org.hibernate
hibernate-validator
4.2.0.Final


org.hibernate
hibernate-entitymanager
5.0.1.Final


javax.transaction
jta
1.1


org.springframework
spring-jdbc
3.2.14.RELEASE


org.springframework
spring-orm
3.2.14.RELEASE


net.sourceforge.jtds
jtds
1.3.1


junit
junit
4.12
test


info.cukes
cucumber-java
1.2.4
test


info.cukes
cucumber-junit
1.2.4
test


org.hamcrest
hamcrest-all
1.3
test


org.springframework
spring-test
3.2.14.RELEASE
test


com.jayway.jsonpath
json-path
0.8.1
test

JPA上下文:














Web.xml:


contextConfigLocation classpath:/jpaContext.xml org.springframework.web.context.ContextLoaderListener
dataByCode
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation /WEB-INF/config/servlet-config.xml


dataByCode
/data


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测试框架失败。

0
0 Comments

问题的原因是测试代码中设置了请求的Content-Type为application/json,但是控制器却期望接收一个请求参数而不是JSON。这导致了406错误的出现。

解决方法是移除测试代码中的设置Content-Type的部分,或者在控制器中修改接收请求的方式,使其能够正确处理JSON数据。

0
0 Comments

问题出现的原因是测试中缺少了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的问题了。

0
0 Comments

问题的出现原因是测试中的JSON端点返回406错误。解决方法是将servletConfig.xml添加到测试类的@ContextConfiguration注解中,并确保<mvc:annotation-driven/>被包含在内。另外,可以通过使用@RestController注解来简化控制器并使其目的更加清晰。

0