如何在JUnit Jupiter中测试类方法且不调用其他方法修改对象状态?
测试场景实现方案
你可以选择两种方案实现私有棋盘成员的修改,不需要改原有业务代码的访问权限:
方案1:Java原生反射实现(无额外依赖,推荐优先用)
直接通过反射获取TicTacToe类的私有board字段,修改为你需要的全满棋盘状态即可,代码示例补充到你的printBoard测试方法中:
// 先清空之前的输出流缓存 outputStreamCaptor.reset(); try { // 获取私有board字段 Field boardField = TicTacToe.class.getDeclaredField("board"); // 开启访问权限 boardField.setAccessible(true); // 构造全满测试棋盘,可自定义布局 char[][] fullBoard = { {'X', 'O', 'X'}, {'O', 'X', 'O'}, {'O', 'X', 'O'} }; // 给当前game对象的board字段赋值 boardField.set(game, fullBoard); } catch (NoSuchFieldException | IllegalAccessException e) { fail("反射修改board字段失败: " + e.getMessage()); } // 调用打印方法 game.printBoard(); // 校验输出,用System.lineSeparator()适配不同操作系统的换行符 String expected = "X ,O ,X" + System.lineSeparator() + "O ,X ,O" + System.lineSeparator() + "O ,X ,O"; assertEquals(expected, outputStreamCaptor.toString().trim());
记得在测试类导入java.lang.reflect.Field。
方案2:Manifold @Jailbreak 正确配置(IntelliJ环境)
你之前调试失败大概率是没完成完整配置,按以下步骤操作即可:
- 第一步:安装Manifold插件:IntelliJ打开
设置>插件,搜索Manifold安装后重启IDE - 第二步:开启注解处理器:打开
设置>构建、执行、部署>编译器>注解处理器,勾选启用注解处理 - 第三步:项目引入Manifold依赖,以Maven为例,在pom.xml中加入:
<dependencies> <dependency> <groupId>systems.manifold</groupId> <artifactId>manifold-ext</artifactId> <version>2023.1.30</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>11</source> <!-- 对应你使用的JDK版本 --> <target>11</target> <annotationProcessorPaths> <path> <groupId>systems.manifold</groupId> <artifactId>manifold-ext</artifactId> <version>2023.1.30</version> </path> </annotationProcessorPaths> <compilerArgs> <arg>-Xplugin:Manifold</arg> </compilerArgs> </configuration> </plugin> </plugins> </build>
配置完成后就可以直接用@Jailbreak访问私有成员,测试代码写法:
// 导入注解 import manifold.ext.rt.api.Jailbreak; // 声明时加@Jailbreak注解 @Jailbreak TicTacToe game = new TicTacToe(); // 直接赋值board字段 game.board = new char[][]{ {'X', 'O', 'X'}, {'O', 'X', 'O'}, {'O', 'X', 'O'} }; // 后续打印校验逻辑和反射方案一致
内容的提问来源于stack exchange,提问作者JCrew0
相关产品推荐
相关产品推荐

