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

编写依赖其他类的JUnit测试:基于Item与Stock类的测试需求

JUnit测试指导:基于Item和Stock类

先把你提供的两个类代码贴出来方便参考:

Item类代码

public class Item implements Cloneable { 
    private String name; 
    private int reorderAmount; 
    public Item(String name, int reorderAmount) { 
        this.name = name; 
        this.reorderAmount = reorderAmount; 
    } 
    /** 
     * @return The Amount of a reorder. 
     */ 
    public int getReorderAmount() { 
        return reorderAmount; 
    } 
}

Stock类代码(未完成)

public class Stock extends HashMap { 
    private HashMap<String, Item> stock; 
    /** 
     * Constructor. Creates a stock. 
     */ 
    public Stock() { 
        stock = new HashMap<...

接下来我会分模块给你JUnit测试的具体指导和代码示例:

1. 先搞定依赖准备

首先确保你的项目已经引入JUnit 5(Jupiter)的依赖——这是目前最常用的版本。如果用Maven,在pom.xml里添加类似配置:

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-api</artifactId>
    <version>5.9.2</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-engine</artifactId>
    <version>5.9.2</version>
    <scope>test</scope>
</dependency>

Gradle的话对应调整依赖配置即可。

2. Item类的测试重点与示例

Item类核心是构造初始化、getReorderAmount方法,还有Cloneable接口的实现,所以测试覆盖这几个点:

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

class ItemTest {

    // 测试构造函数是否正确初始化,以及get方法返回值是否符合预期
    @Test
    void testConstructorAndReorderAmountRetrieval() {
        String testName = "Wireless Headset";
        int testReorderQty = 8;
        Item testItem = new Item(testName, testReorderQty);
        
        // 验证重订数量正确
        assertEquals(testReorderQty, testItem.getReorderAmount());
        // 注:如果后续给Item添加getName()方法,这里可以再加一行验证name字段
    }

    // 测试克隆功能——因为Item实现了Cloneable,要确保克隆出的对象是独立实例且字段值一致
    @Test
    void testCloneFunctionality() throws CloneNotSupportedException {
        Item originalItem = new Item("USB Drive", 20);
        Item clonedItem = (Item) originalItem.clone();
        
        // 验证字段值完全一致
        assertEquals(originalItem.getReorderAmount(), clonedItem.getReorderAmount());
        // 验证是不同的对象实例(浅克隆,这里字段都是基本类型/不可变类,没问题)
        assertNotSame(originalItem, clonedItem);
    }
}

3. Stock类的测试重点与示例

注意你的Stock类设计有点特殊:既继承了HashMap,又内部维护了一个HashMap<String, Item>字段,这会造成冗余。建议先优化设计:要么放弃继承HashMap,只用组合(内部stock字段),要么直接用继承的HashMap存储库存数据,避免重复存储。

假设你完善Stock类,添加了addItem(String id, Item item)、getItem(String id)、removeItem(String id)、isEmpty()这些基础方法,测试示例如下:

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

class StockTest {

    // 测试初始化后的库存是空的
    @Test
    void testInitialStockIsEmpty() {
        Stock inventory = new Stock();
        assertTrue(inventory.isEmpty());
    }

    // 测试添加商品后能正确检索到
    @Test
    void testAddAndRetrieveItem() {
        Stock inventory = new Stock();
        Item testItem = new Item("Mechanical Keyboard", 12);
        String itemId = "KB-MECH-001";
        
        inventory.addItem(itemId, testItem);
        Item retrievedItem = inventory.getItem(itemId);
        
        assertNotNull(retrievedItem);
        assertEquals(testItem.getReorderAmount(), retrievedItem.getReorderAmount());
        // 因为是存储引用,所以应该是同一个实例
        assertSame(testItem, retrievedItem);
    }

    // 测试移除商品后无法再检索到
    @Test
    void testRemoveItem() {
        Stock inventory = new Stock();
        String itemId = "MON-LED-001";
        inventory.addItem(itemId, new Item("LED Monitor", 5));
        
        inventory.removeItem(itemId);
        assertNull(inventory.getItem(itemId));
    }
}

4. 额外的测试建议

  • 边界场景覆盖:比如测试Stock中添加null键/值、检索不存在的商品ID、重复添加同一个ID的商品(看是覆盖还是报错,根据需求验证)。
  • 参数化测试:如果要测试多种Item初始化或Stock操作的场景,用JUnit 5的@ParameterizedTest可以减少重复代码,比如一次性测试多个不同的重订数量。
  • Stock设计优化:继承HashMap通常不是好的实践(违反里氏替换原则),建议用组合模式封装内部的HashMap,暴露业务相关的方法,而不是直接暴露HashMap的所有方法。

内容的提问来源于stack exchange,提问作者Sam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:24:20