单元测试是程序员编写的一段代码,用于执行另外一段代码的行为是否和预期的一致。
环境配置
使用的maven导入所需要的包,笔者使用的Junit4、Junit5、PowerMock、Mockito包
<dependency> <groupId>org.powermock</groupId> <artifactId>powermock-module-junit4</artifactId> <version>2.0.9</version> <scope>test</scope> </dependency> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-api-mockito</artifactId> <version>1.7.4</version> <scope>test</scope> </dependency> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-core</artifactId> <version>2.0.9</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter</artifactId> <version>RELEASE</version> <scope>test</scope> </dependency> 被测试的类
public class Largest { public static int largest(int [ ] list){ int index = 0; int max = 0; for (index = 0; index < list.length-1; index++) { if (list[index] > max) { max = list[index]; } } return max; } } 测试类 该类是从循环中取出最大值,对于给定的一个list,显然元素的位置对该方法的结果不会产生影响,马上就会想到如下的测试: [7,8,9] [8,7,9] [9,7,8] 如果list中有两个相等,会出现什么情况呢 [7,9,8,9] 如果list中只有一个元素呢 [1] - > 1 如果list中含有负数呢 [-9,-8,-7] 单元测试代码如下:
import org.junit.jupiter.api.Test; import static org.junit.Assert.assertEquals; import static org.junit.jupiter.api.Assertions.*; public class LargestTest { @Test void largest() { assertEquals(9,Largest.largest(new int[]{7,8,9})); assertEquals(9,Largest.largest(new int[]{9,8,7})); assertEquals(9,Largest.largest(new int[]{7,9,8})); assertEquals(1,Largest.largest(new int[]{1})); assertEquals(-7,Largest.largest(new int[]{-7,-8,-9})); } } 运行该测试类报错
实际结果与我们期望的结果不相等,发现是list.length-1写错了,应该是list.length。
修改完代码后继续运行:
这个时候期望的是-7,但实际得到的结果是0,通过检查代码发现最大值写的有问题,应该是最小值,马上更改为Integer.MIN_VALUE,在运行
终于运行成功了,好开心。
再想想还有没有设计上需要改动,如果我们传递的是一个空数组给程序时,是不是需要检查是否会抛出一个异常。
修改被测试的代码如下:
public class Largest { public static int largest(int [ ] list){ int index = 0; int max = Integer.MIN_VALUE; if(list.length == 0){ throw new RuntimeException("Empty list"); } for (index = 0; index < list.length; index++) { if (list[index] > max) { max = list[index]; } } return max; } }
添加测试代码:
import org.junit.jupiter.api.Test; import static org.junit.Assert.assertEquals; import static org.junit.jupiter.api.Assertions.*; public class LargestTest { @Test void largest() { Throwable exception = assertThrows(RuntimeException.class,() -> { Largest.largest(new int[]{}); }); assertEquals("Empty list",exception.getMessage()); assertEquals(9,Largest.largest(new int[]{7,8,9})); assertEquals(9,Largest.largest(new int[]{9,8,7})); assertEquals(9,Largest.largest(new int[]{7,9,8})); assertEquals(1,Largest.largest(new int[]{1})); assertEquals(-7,Largest.largest(new int[]{-7,-8,-9})); } } 在继续运行我们的单元测试:
单元测试类运行成功