Java GUI中如何通过JUnit5测试判断输入对话框是否被正常打开?
解决方案
- 先修正代码执行顺序:
MockedStatic的生效范围只限于try-with-resources代码块内部,你原来把按钮点击的逻辑写在块外,此时静态Mock已经被释放,根本捕获不到JOptionPane的方法调用,需要把按钮查找、点击的逻辑移入块内。 - 直接通过
MockedStatic对象的verify方法即可校验静态方法的调用情况,可搭配参数匹配器同时校验入参是否符合预期。
完整可运行的测试代码如下:
import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mockStatic; import static org.mockito.Mockito.times; import org.mockito.MockedStatic; import javax.swing.JOptionPane; @Test public void shouldShowInputDialogOnUpdateTextButtonClick() { try (MockedStatic<JOptionPane> jOptionPane = mockStatic(JOptionPane.class)) { // 查找按钮并触发点击 updateTextButton = (JButton) TestUtils.getChildNamed(activity1, "updateTextButton"); updateTextButton.doClick(); // 校验showInputDialog被调用1次,且入参为指定的提示文本 jOptionPane.verify( () -> JOptionPane.showInputDialog(eq("Enter a string.")), times(1) ); } }
补充说明
如果你不需要严格校验弹窗的提示文本,只需要确认方法被调用过,可以把eq("Enter a string.")替换为anyString()。
另外需要注意静态Mock能力需要依赖mockito-inline组件,不要只引入基础的mockito-core,对应Maven依赖配置参考:
<dependency> <groupId>org.mockito</groupId> <artifactId>mockito-inline</artifactId> <version>4.8.1</version> <!-- 替换为和你项目适配的Mockito版本 --> <scope>test</scope> </dependency>
内容的提问来源于stack exchange,提问作者David Maranga
相关产品推荐
相关产品推荐

