Junit字符串比较断言失败但预期与实际看似一致的问题咨询
问题根因
报错信息已经明确指出核心问题:
org.opentest4j.AssertionFailedError: expected: java.lang.String@4d5b6aac but was: ss.week2.Setting@3e84448c
- 断言的预期值是
java.lang.String类型,而testLamp.getStatus()实际返回的是自定义的ss.week2.Setting枚举类型实例,二者类型完全不同,equals比较直接返回false,因此断言失败。 - 肉眼看起来输出一致的原因是:枚举类的默认
toString()实现会直接返回枚举项的名称,比如Setting.OFF打印输出内容就是OFF,和字符串"OFF"的控制台展示效果相同,容易造成二者值相同的错觉。
修复方案
二选一即可:
方案1:调整断言匹配枚举类型
不需要修改业务代码,直接把断言的预期值替换为对应枚举项:
@Test public void testState() { assertEquals(Setting.OFF, testLamp.getStatus()); } @Test public void testSequence() { testLamp.setNextStatus(); assertEquals(Setting.LOW, testLamp.getStatus()); }
方案2:修改getStatus()返回字符串类型
如果业务要求getStatus()必须返回字符串,调整该方法的返回逻辑即可:
public String getStatus() { // 也可以使用currentSetting.name(),默认枚举实现下和toString()效果一致 return currentSetting.toString(); }
内容的提问来源于stack exchange,提问作者danik
相关产品推荐
相关产品推荐

