编写依赖其他类的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
相关产品推荐
相关产品推荐

