如何用JUnit搭建Java程序基础测试方法及五金店类测试方案
一、如何用JUnit为Java程序搭建基础测试方法?
1. 先搞定依赖配置
如果你用Maven,直接在pom.xml里加JUnit 5的依赖(现在JUnit 5是主流啦):
<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,就在build.gradle里加:
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.9.2' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.9.2'
2. 创建测试类
测试类一般放在src/test/java目录下,和要测试的类包结构保持一致。比如你要测试com.example.HardwareStore,测试类就叫HardwareStoreTest,放在同一个包下就行。
3. 编写基础测试方法
测试方法要加@Test注解(来自org.junit.jupiter.api.Test),方法名最好能说明测试的场景,比如testAddItemSuccess。举个最简单的例子:
import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; public class HardwareStoreTest { @Test void testBasicFunction() { HardwareStore store = new HardwareStore(); // 这里写你的测试逻辑,比如调用方法后断言结果符合预期 assertTrue(store.someMethod()); } }
4. 运行测试
直接在IDE里右键测试类或者测试方法,选择“Run”就行,JUnit会自动执行并给出测试结果——绿条就是通过,红条就是失败,还能看失败原因。
二、五金店项目HardwareStore类的JUnit测试用例编写
既然你已经创建了HardwareStoreTest类,而且不需要测试readDatabase()和writeDatabase(),那咱们就聚焦在数据保存、查询、编辑这些核心业务方法上。下面给你一些具体的测试场景和示例代码:
1. 测试添加商品(比如addItem(Item item)方法)
这个场景要测两种情况:添加成功,以及添加重复商品(如果你的业务逻辑里不允许重复的话)。
@Test void testAddItem_Success() { // 初始化测试用的HardwareStore实例 HardwareStore store = new HardwareStore(); Item testItem = new Item("锤子", "工具", 29.99, 10); // 执行添加操作 boolean result = store.addItem(testItem); // 断言添加成功,并且库存里确实有这个商品 assertTrue(result); assertEquals(testItem, store.getItemByName("锤子")); } @Test void testAddItem_DuplicateItem() { HardwareStore store = new HardwareStore(); Item testItem = new Item("螺丝刀", "工具", 15.99, 20); store.addItem(testItem); // 再次添加同一个商品 boolean result = store.addItem(testItem); // 断言添加失败(如果你的业务逻辑禁止重复) assertFalse(result); // 同时断言库存数量没有变化 assertEquals(20, store.getItemByName("螺丝刀").getStock()); }
2. 测试查询商品(比如getItemByName(String name)、getItemsByCategory(String category)方法)
要测存在的商品能查到,不存在的商品返回null或者空列表:
@Test void testGetItemByName_Exists() { HardwareStore store = new HardwareStore(); Item testItem = new Item("扳手", "工具", 39.99, 5); store.addItem(testItem); Item foundItem = store.getItemByName("扳手"); assertNotNull(foundItem); assertEquals("工具", foundItem.getCategory()); } @Test void testGetItemByName_NotExists() { HardwareStore store = new HardwareStore(); Item foundItem = store.getItemByName("不存在的商品"); assertNull(foundItem); } @Test void testGetItemsByCategory() { HardwareStore store = new HardwareStore(); store.addItem(new Item("锤子", "工具", 29.99, 10)); store.addItem(new Item("钉子", "耗材", 5.99, 100)); store.addItem(new Item("钳子", "工具", 25.99, 8)); List<Item> toolItems = store.getItemsByCategory("工具"); assertEquals(2, toolItems.size()); assertTrue(toolItems.stream().allMatch(item -> "工具".equals(item.getCategory()))); }
3. 测试编辑商品(比如updateItemStock(String name, int newStock)、updateItemPrice(String name, double newPrice)方法)
要测编辑存在的商品能成功,编辑不存在的商品没有效果:
@Test void testUpdateItemStock_Success() { HardwareStore store = new HardwareStore(); Item testItem = new Item("钻头", "工具", 49.99, 15); store.addItem(testItem); boolean result = store.updateItemStock("钻头", 25); assertTrue(result); assertEquals(25, store.getItemByName("钻头").getStock()); } @Test void testUpdateItemPrice_ItemNotExists() { HardwareStore store = new HardwareStore(); boolean result = store.updateItemPrice("不存在的商品", 99.99); assertFalse(result); }
一些实用小技巧
- 每个测试方法要保持独立性:不要让一个测试的结果影响另一个,所以最好每个测试方法里都新建一个
HardwareStore实例,或者用@BeforeEach注解在每个测试前初始化:
import org.junit.jupiter.api.BeforeEach; private HardwareStore store; @BeforeEach void setUp() { store = new HardwareStore(); // 还可以在这里预先添加一些通用测试数据,减少重复代码 }
- 断言尽量用具体方法:比如
assertEquals、assertNotNull,比assertTrue更清晰,失败时能给出明确的错误信息。
内容的提问来源于stack exchange,提问作者QThomp




