我是否需要在没有逻辑的情况下为服务方法编写单元测试?

loading...


3

我需要这样的测试服务方法吗?

@Transactional
@Override
public Charge saveAndFlush(Charge charge) {
    return chargesRepository.saveAndFlush(charge);
}

原则上,没有什么可以测试的 . 因此,问题出现了 - 无论如何要编写测试,因为将来有人可能会在这里添加逻辑 . 或者让他写一个将添加逻辑的人(如果有的话) .

loading...

5回答

  • 0

    这种方法存在的关键原因是事务注释和对费用存储库的副作用 . 这也是最不可能/唯一不能按预期工作的事情 . 这是你通过集成测试找到的东西 . 单元测试这完全没有意义,因为你要模拟存储并忽略注释 . 所以,你基本上是单元测试,模拟的随机调用工作 . 令人惊讶的是,这往往主要是按照您的希望工作 .

    因此,请确保只使用少量良好的集成/场景测试来覆盖所有相关的存储库方法(即,不要为每个方法编写一个但将它们组合到实际场景中) . 焦点单元测试具有多于一行代码或任何类型分支的算法复杂度的事物 . 这样,当使用实际业务逻辑对服务类进行单元测试时,您可以模拟DAO类,因为您已经知道DAO具有集成测试所需的副作用 .


  • 1

    没有什么可以测试的

    好吧,有 . 因为没有测试无法区分正确的实现和以下错误的“实现”:

    {
       return null;
    }
    
    {
       return chargesRepository.saveAndFlush(null);
    }
    
    {
       return chargesRepository.saveAndFlush(new Charge());
    }
    
    {
       return chargesRepository.someOtherMethod(charge);
    }
    

    但你认为没有什么可以测试的 . 假设 chargesRepository 的类已经过正确测试,您只需要一个或两个单元测试来显示该方法正确委托给 chargesRepository .


  • 1

    我找到了类似问题的答案:

    肯特贝克的经验法则:

    测试可能破坏的一切 . 当然,这在某种程度上是主观的 . 对我来说,琐碎的吸气剂/安装者和像你这样的单线通常是不值得的 . 但话说回来,我花了大部分时间为遗留代码编写单元测试,只是梦想着一个漂亮的绿地TDD项目......在这样的项目中,规则是不同的 . 使用遗留代码,主要目标是尽可能少地覆盖尽可能多的基础,因此单元测试往往更高级别和更复杂,更像是集成测试,如果一个人对术语迂腐 . 当你努力使整体代码覆盖率从0%上升,或者只是设法使其超过25%时,单元测试的getter和setter是你最不担心的 .

    在绿地TDD项目中的OTOH,即使对于这样的方法,编写测试也可能更为重要 . 特别是在您有机会开始怀疑“这一行是否值得专门测试?”之前,您已经编写了测试 . 至少这些测试对于编写和快速运行来说是微不足道的,因此无论如何这都不是什么大问题 .


  • 1

    就个人而言,我现在跳过为此服务方法编写测试 . 无论如何,您还需要为MVC部件编写测试 . 检查 endpoints :

    • 返回JSON / XML /等等

    • 接受并解析HTTP参数

    • 不访问惰性字段

    • 将逻辑传播到正确的服务并启动ORM会话和事务

    endpoints 将调用此服务并将隐式测试它 .

    稍后当您向此服务添加更多逻辑时 - 您也可以添加服务层测试(编写大量MVC测试更难和更慢) . 我不会把它们写成单元测试(参见下面的文章) .

    P.S我可以在哪里阅读究竟是什么以及如何测试? ......我还没有找到如何测试的实际例子以及比hello world更难测试的例子

    希望这些会有所帮助:


  • 0

    一般来说,您将单元测试集中在通过执行某些计算或处理来返回值的代码上 .
    您可以对一个不返回任何值的方法进行单元测试,以确保在执行所有可能的路径时不会运行异常 .
    在上面的情况下,我相信你不应该为它写一个测试 . 有's really no logic in that method and you' d单元测试 spring 框架 . 由于 spring 框架已经进行了大量的单元测试,所以没有必要这样做 .
    请注意,单元测试应该运行得很快并且必须独立运行,也就是说,单元测试不能依赖于数据库或网络连接 . 所以这是不对其进行单元测试的另一个原因,因为您将依赖于数据库来验证代码是否有效 .

评论

暂时没有评论!