如何为Core类的Getter方法编写正确的JUnit测试用例
Core类Getter方法的JUnit5测试实现方案
你当前的Core类两个Getter都是直接返回内部可变集合的引用,测试需要覆盖三类核心场景,确保实现行为符合预期,下面是可直接运行的合规测试代码:
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import java.util.Deque; import java.util.HashMap; import static org.junit.jupiter.api.Assertions.*; class CoreTest { private Core core; @BeforeEach void initTestInstance() { // 每个用例执行前新建独立Core实例,避免用例间状态干扰 core = new Core(); } // 测试getStack()相关逻辑 @Test void getStack_shouldReturnNonNullEmptyDequeWhenCoreInitialized() { Deque<Double> stack = core.getStack(); assertNotNull(stack); assertTrue(stack.isEmpty()); } @Test void getStack_shouldReturnSameInstanceOnMultipleCalls() { Deque<Double> firstCallResult = core.getStack(); Deque<Double> secondCallResult = core.getStack(); // 直接返回内部字段引用时,多次调用返回同一对象 assertSame(firstCallResult, secondCallResult); } @Test void getStack_returnedReferenceModificationWillChangeInternalState() { Deque<Double> stack = core.getStack(); Double testNum = 2.718; stack.push(testNum); assertEquals(1, core.getStack().size()); assertEquals(testNum, core.getStack().peek()); } // 测试getValues()相关逻辑 @Test void getValues_shouldReturnNonNullEmptyMapWhenCoreInitialized() { HashMap<String, Double> values = core.getValues(); assertNotNull(values); assertTrue(values.isEmpty()); } @Test void getValues_shouldReturnSameInstanceOnMultipleCalls() { HashMap<String, Double> firstCallResult = core.getValues(); HashMap<String, Double> secondCallResult = core.getValues(); assertSame(firstCallResult, secondCallResult); } @Test void getValues_returnedReferenceModificationWillChangeInternalState() { HashMap<String, Double> values = core.getValues(); String testKey = "e"; Double testValue = 2.718; values.put(testKey, testValue); assertEquals(1, core.getValues().size()); assertEquals(testValue, core.getValues().get(testKey)); } }
补充说明
你当前的Getter实现直接暴露了内部可变集合的外部修改权限,会破坏类的封装性,外部代码可以绕过Core的业务逻辑直接改动内部存储数据。如果业务要求Core的内部状态不允许被外部随意修改,需要调整Getter返回集合的防御性拷贝(比如
return new ArrayDeque<>(stack);、return new HashMap<>(values);),调整后上面两个验证「修改返回对象影响内部状态」的用例会执行失败,对应修改断言逻辑为「修改返回的集合不会改动Core内部状态」即可。
如果你用的是JUnit4版本,只需要把@BeforeEach替换为@Before,断言类替换为org.junit.Assert下的对应静态方法,测试逻辑完全通用。
内容的提问来源于stack exchange,提问作者venus
相关产品推荐
相关产品推荐

