今天在我写单元测试的时候突然发现一个奇怪的事情。我写入导入的某个断点,进入某个方法,居然发现它里面的一些参数值没有传过来。然后这一篇博客的主要目的是解释。为什么会产生这样的结果?怎么去解决?跟着我的博客,一步一步去查找我的思路,然后去发现问题,解决问题。
当我运行单元测试的时候,我就想着去看一下。他当前这个方法执行之后的一些参数的一些结果。然后就发现神奇的事情,他居然返回为空。完全同步到它里面的内存值,一开始我还想着不是缓存异常,是不是需要去看一下它的一些字节码指令之类的。

我特地打了一个断点。还加了一些条件判断,指定某一个特殊的。属性的时候才会执行这个断点。然后就越发的好奇,怎么可能找不到本地属性呢?

仔细查看代码分析代码结构public class SshFileDirectoryParent extends SshCommon {突然我看到我的关系继承就让我想起想起了我之前进行的一个mock操作。我把一个静态类给所以导致他接下来所有的方法全部都会mock。这就导致一系列的异常,什么控制啊什么判断异常啊,到处的问题。
好了,现在的问题不再是读取。一些声明的属性值的问题了,而是变成了我怎么去。对一些方法进行一个mock或者放行处理。
实际的操作类

默认的全局连接mock

在这里我们可以依据上面的那个mock案例。当我们去执行某个方法的时候,然后直接return。这就对一个方法进行了mock,然后在我仔细的研究之下,我还发现它提供了一个方法。你输入任意参数,它可以直接调用真实的方法。这样的话,他就可以直接把参数传递过去,你只需要在上面声明一个类型就好了。这个mock还是非常方便的。
@Test
void testExecute() {
sshCommonMockedStatic.when(() -> SshCommon.toFileType(anyString(), any(), any()))
.thenReturn(FileTypeEnum.FOLDER);
// 对其他方法进行正常访问
when(SshCommon.hasLinkFolder(anyString(), any(), any())).thenCallRealMethod();
when(SshCommon.toAbsolutePath(anyString(), anyString())).thenCallRealMethod();
List<FileBo> result = SshFileDirectoryParent.execute("user", "password",
"/home/test");
log.info("result:" + Json.getJsonFromObject(result));
Assertions.assertTrue(!result.isEmpty());
}紧接着这里我们就可以看到参数已经传递过来了。

这里我再整理一下关于mock的一个一些操作,因为mock静态类和实力类它有一些区别。他们的mock操作也是不一样的。在我如如下整理了一些关于mock的详细操作。
// 创建一个mock对象
SomeClass mockObject = Mockito.mock(SomeClass.class);
// 对指定方法进行mock
Mockito.when(mockObject.someMethod()).thenReturn(someValue);
// 对其他方法进行正常访问
Mockito.when(mockObject.someMethod()).thenCallRealMethod();
Mockito.doCallRealMethod().when(mockObject);
// mock静态方法
MockedStatic<SshCommon> sshCommonMockedStatic = Mockito.mockStatic(SshCommon.class);
Session session = SshCommon.connect(HOSTNAME, USERNAME, PASSWORD, 22);
sshCommonMockedStatic.when(() -> SshCommon.connect(anyString(), anyString())).thenReturn(session);
// 静态方法进行正常访问
Mockito.when(SshCommon.hasFolder(anyString(), any(), any())).thenCallRealMethod();
// 调用被mock的方法
System.out.println(mockObject.someMethod()); // 输出 someValue
// 调用未被mock的方法
System.out.println(mockObject.otherMethod()); // 调用原始方法解铃还须系铃人,有些时候自己写的bug还是要自己去处理,可能我把这个现象描述给别人看,别人也会很懵逼的一个事情。这时候还是需要冷静思考,沉着分析。着急是没有用的,越急越乱。一步一步慢慢的去分析。然后去解决对应的问题。这个mock操作还是非常管用的,针对有一些我不需要实际去请求具体的。操作我可以直接进行一个mock。进模拟的数据又让我跑全了整体的单元测试。从这个单元测试上面来看,我完全可以自己写,使一些值来进行一个测试,但是后面我发现当我解决了这个问题之后,我跑一下单元测试,又发现我程序之后之中的一些bug,一些异常没有处理到。所以有些时候还是不要取巧,一步一步来。
点赞关注评论一键三连,每周分享技术干货、开源项目、实战经验、国外优质文章翻译等,您的关注将是我的更新动力
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。