首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >静态类参数无法传递问题

静态类参数无法传递问题

原创
作者头像
查拉图斯特拉说
发布于 2024-01-19 23:31:38
发布于 2024-01-19 23:31:38
1.7K0
举报
文章被收录于专栏:后端架构后端架构

前言

今天在我写单元测试的时候突然发现一个奇怪的事情。我写入导入的某个断点,进入某个方法,居然发现它里面的一些参数值没有传过来。然后这一篇博客的主要目的是解释。为什么会产生这样的结果?怎么去解决?跟着我的博客,一步一步去查找我的思路,然后去发现问题,解决问题。

运行测试

当我运行单元测试的时候,我就想着去看一下。他当前这个方法执行之后的一些参数的一些结果。然后就发现神奇的事情,他居然返回为空。完全同步到它里面的内存值,一开始我还想着不是缓存异常,是不是需要去看一下它的一些字节码指令之类的。

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

仔细查看代码分析代码结构public class SshFileDirectoryParent extends SshCommon {突然我看到我的关系继承就让我想起想起了我之前进行的一个mock操作。我把一个静态类给所以导致他接下来所有的方法全部都会mock。这就导致一系列的异常,什么控制啊什么判断异常啊,到处的问题。

好了,现在的问题不再是读取。一些声明的属性值的问题了,而是变成了我怎么去。对一些方法进行一个mock或者放行处理。

再分析单元测试

实际的操作类

默认的全局连接mock

解决方案

在这里我们可以依据上面的那个mock案例。当我们去执行某个方法的时候,然后直接return。这就对一个方法进行了mock,然后在我仔细的研究之下,我还发现它提供了一个方法。你输入任意参数,它可以直接调用真实的方法。这样的话,他就可以直接把参数传递过去,你只需要在上面声明一个类型就好了。这个mock还是非常方便的。

代码语言:javascript
复制
    @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的详细操作。

代码语言:javascript
复制
// 创建一个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,一些异常没有处理到。所以有些时候还是不要取巧,一步一步来。

最后

点赞关注评论一键三连,每周分享技术干货、开源项目、实战经验、国外优质文章翻译等,您的关注将是我的更新动力

我正在参与2024腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 前言
  • 运行测试
  • 再分析单元测试
  • 解决方案
  • 整理所有情况
  • 总结
  • 最后
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档