JUnit测试用例未覆盖问题求助:Stack方法单元测试全部失败
问题分析与解决方案
嘿,我帮你找出问题啦!你的测试全部失败且没有代码覆盖,主要是两个注解相关的错误导致的,咱们一步步来看:
1. JUnit版本注解不兼容
你用的是JUnit 5的@Test注解(来自org.junit.jupiter.api.Test),但初始化方法用的是JUnit 4的@Before注解——这俩版本的注解不兼容!JUnit 5根本不会执行标注了@Before的initialize()方法,所以你的aStackOfInt一直是null,运行测试时都会抛出NullPointerException,自然没法执行到push()/pop()/peek()方法,也就没有代码覆盖了。
解决方法:把@Before换成JUnit 5的@BeforeEach,并且导入正确的包org.junit.jupiter.api.BeforeEach。
2. 测试方法的注解有语法错误
你的testPop()方法上的注解写成了@ Test(中间多了个空格),这会让JUnit识别不到这个方法是测试方法,直接跳过执行。只要把空格删掉,改成@Test就行。
修正后的完整代码
import static org.junit.jupiter.api.Assertions.*; import org.junit.jupiter.api.BeforeEach; // 替换原有的@Before包 import org.junit.jupiter.api.Test; import java.util.Stack; public class StackMethodTesting { private Stack<Integer> aStackOfInt; @BeforeEach // 替换@Before public void initialize() { aStackOfInt = new Stack<>(); // 简化泛型写法 System.out.println("a new Stack"); } @Test public void testpush() { aStackOfInt.push(1); // 自动装箱,无需手动new Integer(1) assertEquals(1, aStackOfInt.peek()); // 直接用int值,JUnit会处理自动拆箱比较 } @Test // 删掉注解中间的空格 public void testPop() { aStackOfInt.push(22); assertEquals(22, aStackOfInt.pop()); } @Test public void testpeek() { aStackOfInt.push(222); assertEquals(222, aStackOfInt.peek()); } }
另外补充两个小优化:
- 不用手动
new Integer(),Java会自动把int装箱成Integer,代码更简洁; assertEquals直接用int值和返回的Integer比较就行,JUnit会处理自动拆箱的逻辑,结果和用equals()是一致的。
现在运行测试,应该就能正常执行,并且正确统计代码覆盖啦!
内容的提问来源于stack exchange,提问作者user42493
相关产品推荐
相关产品推荐

