V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
hsuyeung
V2EX  ›  程序员

单元测试问题请教

  •  
  •   hsuyeung · 2022-10-13 19:35:57 +08:00 · 1887 次点击
    这是一个创建于 800 天前的主题,其中的信息可能已经有所发展或是发生改变。

    尝试为 Service 层的方法添加单元测试,写着写着发现方法中需要用到请求头中携带的 token 获取用户信息才可以走完整套逻辑,那我的单元测试应该要怎样才可以模拟出 token 呢?

    第 1 条附言  ·  2022-10-13 20:06:57 +08:00
    刚才网上搜索了下看到了 test 包自带的 MockMvc ,似乎可以实现我目前的逻辑,先研究一下看看。
    第 2 条附言  ·  2022-10-13 20:26:44 +08:00
    刚想了想,我感觉还是应该把“从 token 中获取用户信息”这一操作放到 api 层去处理,然后将用户信息或者其中某些字段作为参数传递到 service 中,service 只处理业务逻辑这样更好些。
    15 条回复    2022-10-14 22:43:04 +08:00
    lanlanye
        1
    lanlanye  
       2022-10-13 19:38:24 +08:00
    写一个验证服务的 Stub ,注入你的服务,代替掉真正的验证服务
    retanoj
        2
    retanoj  
       2022-10-13 19:40:26 +08:00
    就各种 mock ,侵入式 mock
    chihiro2014
        3
    chihiro2014  
       2022-10-13 19:53:13 +08:00
    mock token 对象
    ihuotui
        4
    ihuotui  
       2022-10-13 20:04:50 +08:00
    当为类或者方法写单元测试很难写,代表代码耦合度太高,需要解耦,把不同功能的方法分离,才能写出单元测试,从下往上写。如果下面方法都是正确,那么整体代码正确。
    ihuotui
        5
    ihuotui  
       2022-10-13 20:05:21 +08:00
    最近写了个单元测试的文章,有点公司内容我修改下发出来。
    hsuyeung
        6
    hsuyeung  
    OP
       2022-10-13 20:05:56 +08:00
    @ihuotui 感谢!期待期待
    hunterzhang86
        7
    hunterzhang86  
       2022-10-13 20:22:11 +08:00
    carrymaniac
        8
    carrymaniac  
       2022-10-13 20:23:26 +08:00
    按照我的理解,service 不太应该和请求头这些东西打交道,解析请求头这些操作在 controller 完成。service 的单元测试也就不用考虑解析 token 等事项了。
    hunterzhang86
        9
    hunterzhang86  
       2022-10-13 20:23:27 +08:00
    carrymaniac
        10
    carrymaniac  
       2022-10-13 20:27:19 +08:00
    如果使用的是 springboot mockMVC 的话 可以使用
    mockMvc.perform('/xxxx')
    .with(csrf())
.with(jwt().jwt(jwt)))
    hsuyeung
        11
    hsuyeung  
    OP
       2022-10-13 20:27:41 +08:00 via iPhone
    @carrymaniac 我刚想了下,也是觉得应该这样更好些,使用 mock 局限性太大了(只能去对 controller )做测试
    xavierchow
        12
    xavierchow  
       2022-10-13 20:36:12 +08:00   ❤️ 2
    > 刚想了想,我感觉还是应该把“从 token 中获取用户信息”这一操作放到 api 层去处理,然后将用户信息或者其中某些字段作为参数传递到 service 中,service 只处理业务逻辑这样更好些。

    对的,这就是写测试代码的好处,促使你重新思考分层 /解耦有么有做好,测试困难很可能代码设计就有坏味道了。
    sdot96
        13
    sdot96  
       2022-10-14 16:42:35 +08:00
    一般都有 mock 包,可以针对变量,方法,接口,函数进行 mock ,如果是 golang 可以看下我的文章有详细的关于单元测试的一些思考 https://zhuanlan.zhihu.com/p/565209330

    或者你说的将把“从 token 中获取用户信息”这一操作放到 api 层去处理,我感觉这样好像更加合适,因为我倾向能不 mock 就尽量不 mock
    ihuotui
        14
    ihuotui  
       2022-10-14 22:41:19 +08:00
    https://www.cnblogs.com/ihuotui/p/16793249.html
    1 单元测试的效益
    2 介绍单元测试
    3 编写简单的单元测试
    4 好的单元测试(提升)
    ihuotui
        15
    ihuotui  
       2022-10-14 22:43:04 +08:00
    @hsuyeung
    单元测试之道 junit
    1 单元测试的效益
    2 介绍单元测试
    3 编写简单的单元测试
    4 好的单元测试(提升)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2619 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 10:50 · PVG 18:50 · LAX 02:50 · JFK 05:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.