JUnit测试JSON响应时触发AssertionError问题求助
排查Spring单元测试中AssertionError:预期空或null但得到"Debug"的问题
嘿,刚上手Spring单元测试就遇到这个小问题很正常,咱们一步步拆解来解决:
首先先把你遇到的错误信息摆出来,方便定位:
java.lang.AssertionError: Response content Expected: (null or an empty string) but: was "Debug"
这个错误已经说得很直白了——你的测试用例期望接口返回空字符串或者null,但实际接口返回了字符串"Debug",所以断言直接失败了。
问题根源拆解
1. 接口的实际行为
看你的PersonController代码,lastName接口的逻辑是:
- 接收
cid参数 - 调用
personService.findByCId(cid)拿到Person对象 - 返回该对象的
lastName属性
你测试时传的cid=123456,这说明personService.findByCId("123456")返回的Person对象,它的lastName值就是**"Debug"**——这是接口的真实返回结果,本身没问题。
2. 测试用例的矛盾点
你的测试方法名叫shouldReturnNonNullString(意思是应该返回非空字符串),但你写的断言却是:
.andExpect(content().string(isEmptyOrNullString()))
这完全是逻辑写反了!这个断言是在检查响应内容为空或者null,但你的接口明明返回了有效的"Debug"字符串,断言自然会失败。
解决方案
根据测试方法的命名,你应该是想验证接口能返回非空的字符串,所以把断言改成下面两种方式之一就行:
方式一:验证返回非空字符串
.andExpect(content().string(not(isEmptyOrNullString())))
方式二:如果知道预期返回值,直接断言具体内容
.andExpect(content().string("Debug"))
额外优化建议:Mock服务避免依赖真实数据
如果这是单元测试,建议用@MockBean来MockPersonService的行为,这样你可以完全控制返回值,不用依赖真实的数据库或者其他服务:
修改后的测试类示例:
@RunWith(SpringRunner.class) @SpringBootTest @AutoConfigureMockMvc public class MvcLastNameTest { @Autowired private MockMvc mockMvc; // 用@MockBean来Mock PersonService @MockBean private PersonService personService; @Test public void shouldReturnNonNullString() throws Exception { // 预设:当传入cid=123456时,返回一个lastName为"TestLastName"的Person对象 Person mockPerson = new Person(); mockPerson.setLastName("TestLastName"); when(personService.findByCId("123456")).thenReturn(mockPerson); this.mockMvc.perform(get("/person/lastName?cid=123456")) .andDo(print()) .andExpect(status().isOk()) // 断言返回预设的字符串 .andExpect(content().string("TestLastName")); } }
这样你的测试就不会受真实数据的影响,结果更稳定可控。
内容的提问来源于stack exchange,提问作者Mr Man
相关产品推荐
相关产品推荐

