You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 10:12:20