在java单元测试中测试边界条件,核心做法是利用junit 5的`@parameterizedtest`结合`@valuesource`或`@csvsource`,将数组、集合或字符串等输入数据的临界值(如空值、零、最大/最小索引、极值)作为参数传入测试方法。通过这种方式,可以一次性验证多个边界场景,确保代码在处理极端情况时不会抛出异常或产生错误结果。

如何为List接口实现类编写边界测试
针对`List`接口的具体实现类(如`ArrayList`),边界测试应覆盖空列表、单元素列表以及索引越界的情况。使用`@MethodSource`可以提供更复杂的对象构造逻辑,而`@ValueSource`适合简单的原始类型或字符串。对于`get`操作,需验证合法索引与非法索引的行为差异;对于`add`操作,需验证容量变化及重复添加后的状态。

import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import java.util.ArrayList;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
public class ArrayListBoundaryTest {
@ParameterizedTest
@ValueSource(ints = {0, 1, 2})
void testGetWithValidIndices(int index) {
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
// 边界:索引0和1是合法的
assertEquals("A", list.get(0));
assertEquals("B", list.get(1));
}
@Test
void testGetWithInvalidIndex() {
List<String> list = new ArrayList<>();
list.add("A");
// 边界:索引2超出大小1,应抛出IndexOutOfBoundsException
assertThrows(IndexOutOfBoundsException.class, () -> list.get(2));
}
@Test
void testAddToEmptyList() {
List<String> list = new ArrayList<>();
list.add("X");
assertEquals(1, list.size());
assertEquals("X", list.get(0));
}
}如何为Map接口实现类编写边界测试
对于`Map`接口的实现类(如`HashMap`),边界测试重点在于键的存在性、空键处理以及并发修改检测。需要验证`containsKey`、`get`、`put`和`remove`在键不存在、键为空、键冲突时的行为。特别注意`HashMap`允许空键,而`TreeMap`对空键的处理可能不同,测试时应明确具体实现类的预期行为。
立即学习“Java免费学习笔记(深入)”;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.NullAndEmptySource;
import org.junit.jupiter.params.provider.ValueSource;
import java.util.HashMap;
import java.util.Map;
import static org.junit.jupiter.api.Assertions.*;
public class HashMapBoundaryTest {
@ParameterizedTest
@NullAndEmptySource
void testPutAndGetWithNullOrEmptyKey(String key) {
Map<String, Integer> map = new HashMap<>();
map.put(key, 100);
assertTrue(map.containsKey(key));
assertEquals(100, map.get(key));
}
@Test
void testGetNonExistentKey() {
Map<String, Integer> map = new HashMap<>();
assertNull(map.get("nonexistent"));
}
@Test
void testRemoveNonExistentKey() {
Map<String, Integer> map = new HashMap<>();
map.put("key", 1);
assertFalse(map.remove("nonexistent"));
assertEquals(1, map.size());
}
}当List的subList返回视图时,修改原List会怎样影响子列表
当调用`List.subList()`时,返回的是一个视图而非副本。如果修改原List的结构(如添加或删除元素),子列表的迭代器或后续操作可能会抛出`ConcurrentModificationException`。这是因为`subList`内部维护了对原List的引用,结构变更会导致期望修改计数不一致。测试此边界条件时,应验证在结构变更后访问子列表元素的异常行为。


















