java - 使用 Mockito 调用多个其他方法的方法的单元测试

标签 java unit-testing mockito

也许我的搜索完全失败了,但我找不到任何与如何为 Java 类/方法编写单元测试相关的文档或讨论,这些类/方法又会调用其他非私有(private)方法。看起来,如果必须使用 spy 来测试需要模拟内部方法调用的方法,Mockito 的立场可能是设计有问题(不是真正的面向对象)。我不确定这是否总是正确的。但使用 spy 似乎是实现这一目标的唯一方法。例如,为什么你不能有一个“包装器”风格的方法,它反过来依赖于其他方法来实现原始功能,但另外提供功能、错误处理、日志记录或依赖于其他方法结果的不同分支等?

所以我的问题有两个方面:

  1. 拥有一个内部调用其他方法的方法是否设计和实现不当?
  2. 如果选择 Mockito 作为他们的模拟框架,为这种方法编写单元测试的最佳实践和/或方法是什么(假设它本身是一个好主意)?

这可能是一个困难的请求,但我希望那些决定回答的人不要仅仅重新发布 Mockito 的措辞和/或对 spy 的立场,因为我已经知道这种方法和意识形态。另外,我也使用过 Powermockito。对我来说,这里的问题是 Mockito 开发了这个框架,必须创建额外的解决方法来支持这种需求。所以我想我想要回答的问题是,如果 spy 是“坏的”,并且 Powermockito 不可用,那么应该如何对调用其他非私有(private)方法的方法进行单元测试?

最佳答案

Is it poorly designed and implemented code to have a method that internally calls other methods?

不是真的。但我要说的是,在这种情况下,调用其他方法的方法应该像其他方法尚未单独测试一样进行测试。 也就是说,它可以防止您的公共(public)方法在您没有注意到的情况下停止调用其他方法。

是的,它(有时)需要大量测试代码。我相信这就是重点:编写测试的痛苦是一个很好的线索,表明您可能要考虑将这些子方法提取到一个单独的类中。

如果我可以接受这些测试,那么我认为还没有提取子方法。

What is the best practice and/or approach in writing a unit test for such a method (assuming it is itself a good idea) if one has chosen Mockito as their mocking framework?

我会这样做:

public class Blah {
    public int publicMethod() {
        return innerMethod();
    }

    int innerMethod() {
        return 0;
    }
}


public class BlahTest {
    @Test
    public void blah() throws Exception {
        Blah spy = spy(new Blah());
        doReturn(1).when(spy).innerMethod();

        assertThat(spy.publicMethod()).isEqualTo(1);
    }
}

关于java - 使用 Mockito 调用多个其他方法的方法的单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12625002/

相关文章:

typescript - 未定义单元测试 mocha Visual Studio Code 描述

c# - 使用 Moq 测试计时器

java - Java中使用XPath检查XML中是否存在节点

java - 卡在 while 循环中

java - hibernate native 查询变量

java - 我正在尝试启动应用程序,但它崩溃了

node.js - 使用 mocha 测试二进制文件上传

java - 创建http响应作为mockito的返回值

dart - Mockito - 在空安全迁移后 stub 一个方法

java - 莫基托 : Basic Code doubts