如何优雅地使用 spock 框架写单测

添加 Spock 依赖 <!-- 1.Spock 相关 --> <dependency> <groupId>org.spockframework</groupId> <artifactId>spock-core</artifactId> <version>1.3-groovy-2.4</version> <scope>test</scope> </dependency> <dependency> <groupId>org.spockframework</groupId> <artifactId>spock-spring</artifactId> <version>1.3-groovy-2.4</version> <scope>test</scope> </dependency> <!-- 2.PowerMock 相关--> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-module-junit4</artifactId> <version>2.0.4</version> <scope>test</scope> </dependency> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-api-mockito2</artifactId> <version>2.0.4</version> <scope>test</scope> </dependency> 单测 Demo 静态类单测 Demo @RunWith(PowerMockRunner.class) @PowerMockRunnerDelegate(Sputnik.class) // 交给 spock 代理执行 @PrepareForTest([静态类.class]) @SuppressStaticInitializationFor(["静态类全名"]) // 限制静态类里的静态代码块初始化 class StaticMethodSpec extends Specification { def service = Mock(UserService) def controller = new UserController(userService: service) void setup() { // Mock静态类 PowerMockito.mockStatic(静态类.class) } @Unroll def "测试类名 #desc"() { given: "给定条件" def user = service.getById(_ as Integer) >> [new User(name: "Alice", age: 12), null] def map = [k1:v1, k2:v2] def list = [1,2,3] and: "mock静态方法返回值" PowerMockito.when(静态类.静态方法(Mockito.any())).thenReturn(自己想要的返回值) when: "调用时" def res = controller.getById(v_id) then: "比较" res != exp // 或者 with(res){ name == v_name age == v_age } where "数据格式" desc | v_id || exp "success" | 1 || new User(name: "Alice", age:12) "fail" | -1 || null } } 捕获异常 def "test 测试类"(){ //... then: def exception = thrown(v_expectException) exception.code == v_expectCode exception.message == v_expectMessage // ... } 校验参数 def "test 测试类"(){ //... then: 1 * 某类.某方法({ it.某属性1 == 属性1 it.某属性2 == 属性2 }) // ... } 参考文献 Spock 单元测试框架介绍以及在美团优选的实践

July 26, 2024 · 1 min · 186 words · JackyLee

随想,看看 Joyful Pandas 项目

最近准备复现一些实验,每次都要重新学 Pandas 的一些语法,刚好看到了这个仓库 joyful-pandas 仓库介绍 作者是 Datawhale,一个专注于数据科学与 AI 领域的开源组织(有 100+ 个仓库,超级厉害!) 2020.1.20 建立仓库,初始化 README.md # Joyful-Pandas A Complete Guide for Pandas Learners 5 年期间不断更新,最近一次是在 2024.10.17,更新了英文的介绍 代码方面 代码写的非常优雅, 不过因为我的 Pandas 版本比较高, 导致部分函数失效, 比如 DataFrame 的 mad 函数, 在 pandas 的 2.0 版本之后就废弃了 或者说使用 any(1) 或者 all(1) 时, 新版的 Pandas 需要显示地指定形参名, 所以建议改为 any(axis=1) 和 all(axis=1) 然后就是格式化稍微有点问题(不影响代码运行) 我的评价是是个非常好的教程仓库! 参考 datawhalechina/joyful-pandas: pandas 中文教程

April 6, 2024 · 1 min · 59 words · JackyLee

Git 一些比较复杂的使用场景

前言 平常使用 git add . 或者 git push|pull|clone 等命令,已经无法满足各种奇怪的需求了, 在使用 Github 的时候,由于对【本地分支】和【远程分支】理解不够深刻,难免会出现各种问题 所以本文章持续记录使用 Git 时遇到的各种复杂场景 1 本地分支相关 1.1 签出会覆盖本地修改 场景描述: 通常我会在 dev 分支上操作, 然后细粒度地提交 commit, 上传到 github 上形成一个 pull-request, 然后 main 再接受 pr,然后合并成一个 但是有时候会忘记切换分支(比如现在就是),直接在 main 上更改 在 vscode 的状态栏就会出现 *,此时想换到 dev 分支 直接切换会出现 该提示下的三个选项分别是什么意思呢? 储藏并签出:希望【暂存区】仍然在当前分支,然后切换到另一个分支 迁移更改:希望将【暂存区】的内容切换到另一个分支,可能要处理冲突问题 强制签出:(不推荐)直接放弃当前分支(比如 main)未提交的 commmit,然后切换为分支 dev 所以该场景我们需要的是【迁移更改】 1.2 暂存 apply 和 pop 什么时候需要【储藏并签出】呢? 比如当自己在 a-branch 上写代码,突然有紧急的 bug 需要在 b-branch 维修,但是 a-branch 还没到达可以提交的阶段,此时就可以使用【储藏并签出】的功能 在修改完以后,回到原先的分支,可以看到 stash 的小图标 ...

April 3, 2024 · 1 min · 166 words · JackyLee

Hugo 简易教程

介绍 Hugo 是一个由 Go 语言编写的静态博客框架 仓库地址: Hugo - github 安装 # windows scoop install hugo # unix brew install hugo 配置文件 默认的配置文件 主题 默认使用 PapaeMod 这个主题 sample-config.yml | hugo-PaperMod Wiki 更新工作流 第一步: 生成文章模板 # 默认模板 hugo new post/xxx.md # 指定模板 hugo new --kind [archetypes] post/xxx.md ## 例如 hugo new --kind post post/whatever.md 第二步: 内容创作 第三步: 提交与发布 如果是草稿态,记得打开 draft:true FAQ Q1: 如果添加图片 第一种方案: 用图床 第二种方案: 使用 index.md 方法,可以参考下文 Hugo 博客插入图片的方法 | Cassius’s Blog ...

April 3, 2024 · 1 min · 92 words · JackyLee

我的第一篇博客

欢迎来到我的博客

April 3, 2024 · 1 min · word · JackyLee