Java中assertTrue与assertFalse工作原理及测试异常排查
JUnit assertTrue/assertFalse 测试异常问题分析与解决
问题现象
- 第一个测试用例
equalsTest调用assertTrue(equals.equalsTest(false)),预期失败却实际通过 - 第二个测试用例
equalsTestTwo调用assertFalse(equals.equalsTest(false)),预期通过却实际失败,仅抛出java.lang.AssertionError
问题原因
问题根源在你编写的JUnitTesting类的equalsTest方法:
- 类中成员变量
number被固定赋值为2,导致if(number == 2)的条件永远成立 - 无论传入
equalsTest的参数是什么值,方法都会执行equals = true并返回,永远走不到else if(number != 2)的分支 - 最终结果:
- 第一个测试用例中,
equalsTest(false)返回true,刚好符合assertTrue的断言要求,所以测试通过 - 第二个测试用例中,
equalsTest(false)仍返回true,但assertFalse要求返回值为false,直接触发断言错误
- 第一个测试用例中,
解决方法
要让测试覆盖两种逻辑分支,需要调整待测试类的设计,同时优化冗余的方法逻辑:
修改后的待测试类
package JUnit; public class JUnitTesting { private int number; // 通过构造方法动态设置number值,支持测试不同场景 public JUnitTesting(int number) { this.number = number; } // 简化方法逻辑:直接判断number是否等于2,返回结果 public boolean isNumberEqualToTwo() { return number == 2; } }
修改后的测试类
package JUnit; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import org.junit.Test; public class JUnitTest{ @Test public void testNumberIsTwo() { // 初始化number为2,预期返回true JUnitTesting testObj = new JUnitTesting(2); assertTrue(testObj.isNumberEqualToTwo()); } @Test public void testNumberIsNotTwo() { // 初始化number为非2的值,预期返回false JUnitTesting testObj = new JUnitTesting(3); assertFalse(testObj.isNumberEqualToTwo()); } }
优化说明
- 给
JUnitTesting添加构造方法,测试时可以自由设置number的值,覆盖“等于2”和“不等于2”两种场景 - 简化方法逻辑,去掉了原方法中无意义的
equals参数,让方法职责更清晰 - 测试方法命名更具语义化,直观体现测试场景
内容的提问来源于stack exchange,提问作者Nick Slack
相关产品推荐
相关产品推荐

