遇Content-Type不支持致对象解析失败,求助JUnit测试调试
一、先搞懂为啥会出这个错
这个错误说白了就是RestAssured“懵了”——它默认等着服务器返回JSON或者XML这种能解析成对象的格式,但实际收到的是text/html;charset=utf-8类型的响应(大概率是个错误页面,比如401未授权、404找不到接口的HTML页面),它不知道该怎么把HTML转换成你要的Java对象,所以就报错了。
二、一步步解决问题
1. 先看看服务器到底返回了啥
咱们先临时加一行代码,把响应的所有内容打出来,搞清楚是不是真的返回了错误页面:
givenAuth() .get(URL_PREFIX + "/你要测试的接口路径") .then() .log().all(); // 把请求和响应的所有细节都打印出来
跑一下测试,看看控制台里的响应内容——如果是一堆HTML标签,那基本就是接口访问出问题了(比如没登录成功,服务器跳转到登录页面;或者URL写错了,返回404页面)。
2. 处理Content-Type不匹配的情况
如果确认接口应该返回JSON,但服务器标错了Content-Type,或者你只是想拿响应文本不想解析对象,可以这么搞:
- 强制RestAssured把响应当成JSON解析:
YourResponseClass response = givenAuth() .get(URL_PREFIX + "/目标接口") .then() .contentType(ContentType.JSON) // 不管服务器返回啥类型,强制按JSON解析 .extract().as(YourResponseClass.class);
- 只拿响应文本,不解析成对象:
String responseBody = givenAuth() .get(URL_PREFIX + "/目标接口") .then() .extract().asString();
3. 把登录拿Cookie的代码补全
你的givenAuth()方法没写完,这十有八九是后续请求未授权的原因!完整的表单登录拿Cookie的代码可以参考这个:
// 先定义表单登录的配置:登录接口路径、用户名参数名、密码参数名 private static final FormAuthConfig formLoginConfig = new FormAuthConfig("/login", "username", "password"); private String authCookie; private RequestSpecification givenAuth() { if (authCookie == null) { // 执行登录请求,获取会话Cookie authCookie = RestAssured.given() .auth().form("user", "userPass", formLoginConfig) .post(URL_PREFIX + "/login") // 替换成你实际的登录接口地址 .getCookie("JSESSIONID"); // 替换成你项目里实际的Cookie名称,比如SESSIONID } // 后续请求带上这个Cookie return RestAssured.given() .cookie("JSESSIONID", authCookie); }
注意要替换成你项目里真实的登录接口路径、表单参数名(比如有的项目用userName而不是username)和Cookie名称哦。
4. 检查Spring测试上下文配置
你的@ContextConfiguration里把Account.class和AccountDao.class都加进去了,这俩是实体类和DAO类,一般不需要放在配置类列表里,只需要放配置类TestConfig.class就行:
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = { TestConfig.class }, loader = AnnotationConfigContextLoader.class) public class AccountTest { // ... 其他代码 }
如果TestConfig里没扫描这些类的包,记得给TestConfig加个@ComponentScan(basePackages = "com.yourpackage"),指定你的实体类和DAO所在的包。
三、调试小技巧
- 先单独测登录接口:直接写个小测试,只跑登录代码,看看能不能拿到Cookie,登录接口的响应是不是正常的JSON。
- 带着Cookie测目标接口:确认登录成功后,再访问你要测的接口,看响应内容和Content-Type是不是符合预期。
- 如果还是返回HTML,检查用户名密码对不对、登录接口路径有没有写错、表单参数名是不是和后端匹配。
内容的提问来源于stack exchange,提问作者Jesse James

