如何为现有Java Robot类的move方法编写JUnit测试
JUnit move方法完整测试实现方案
测试覆盖逻辑
move方法核心逻辑是根据不同地形类型修正dx、dy后更新自身x、y坐标,固定返回0。测试需要覆盖所有分支场景,验证坐标更新规则和返回值符合预期,覆盖场景包括:
- terrain_type=0 双倍移动分支
- terrain_type=1 半速移动分支(额外覆盖整数除法边界场景)
- terrain_type为其他值的无修正移动分支
- 验证方法固定返回0的逻辑
完整实现代码
以下为JUnit 5版本实现,默认测试类与Robot类在同一包下,可直接访问包级权限的x、y属性,若属性为私有可给Robot类添加getX()、getY()公共方法即可。
单场景独立测试写法
import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; class RobotTest { // 测试terrain_type=0 双倍移动场景 @Test void move_terrainType0_doubleDistance() { Robot testSubject = new Robot(5, 5, 10); double result = testSubject.move(2, 2, 0); // 验证返回值固定为0 assertEquals(0, result); // 验证坐标:dx=2*2=4,x=5+4=9;dy=2*2=4,y=5+4=9 assertEquals(9, testSubject.x); assertEquals(9, testSubject.y); } // 测试terrain_type=1 半速移动场景(覆盖整数除法边界) @Test void move_terrainType1_halfDistance() { Robot testSubject = new Robot(5, 5, 10); double result = testSubject.move(3, 3, 1); assertEquals(0, result); // 验证坐标:dx=3/2=1,x=5+1=6;dy=3/2=1,y=5+1=6 assertEquals(6, testSubject.x); assertEquals(6, testSubject.y); } // 测试terrain_type为其他值 无修正移动场景 @Test void move_terrainTypeOther_originalDistance() { Robot testSubject = new Robot(5, 5, 10); double result = testSubject.move(2, 2, 2); assertEquals(0, result); // 验证坐标:dx=2,x=5+2=7;dy=2,y=5+2=7 assertEquals(7, testSubject.x); assertEquals(7, testSubject.y); } }
参数化测试简化写法
如果希望减少重复代码,可使用参数化测试批量覆盖所有场景:
import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; import static org.junit.jupiter.api.Assertions.*; class RobotTest { @ParameterizedTest @CsvSource({ // 初始x, 初始y, dx, dy, 地形类型, 预期x, 预期y "5, 5, 2, 2, 0, 9, 9", "5, 5, 3, 3, 1, 6, 6", "5, 5, 2, 2, 2, 7, 7", "0, 0, 5, 7, 1, 2, 3" // 额外覆盖奇数dx、dy的整数除法场景 }) void move_allScenarios_returnCorrectResult(int initialX, int initialY, int dx, int dy, int terrainType, int expectedX, int expectedY) { Robot testSubject = new Robot(initialX, initialY, 10); double result = testSubject.move(dx, dy, terrainType); assertEquals(0, result); assertEquals(expectedX, testSubject.x); assertEquals(expectedY, testSubject.y); } }
内容的提问来源于stack exchange,提问作者Joose
相关产品推荐
相关产品推荐

