You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用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();
    // 还可以在这里预先添加一些通用测试数据,减少重复代码
}
  • 断言尽量用具体方法:比如assertEqualsassertNotNull,比assertTrue更清晰,失败时能给出明确的错误信息。

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

火山引擎 最新活动