【问题标题】:How do you stub an individual method in java for unit testing?你如何在java中为单元测试存根单个方法?
【发布时间】:2009-06-30 21:21:00
【问题描述】:

我在一个类中有一个方法正在写入某个字符串,该方法调用另一个执行相同操作的方法。比如:

void foo() {
  a += "xyx";
  bar();
}

void bar() {
  a += "abc";
}

出于单元测试的目的,我想分别测试 foo 和 bar。当我调用 foo() 或用其他方法替换它时,有什么方法可以防止 bar 运行?

【问题讨论】:

    标签: java unit-testing stub


    【解决方案1】:

    创建一个覆盖 bar() 的子类,它什么都不做。

    【讨论】:

    • 客户端代码是什么样的?您如何实例化现在覆盖 bar() 的类。因此,您将不得不更改实例化新类的代码(或工厂)。正如我在下面所说的,我认为我们需要更多关于这个问题的细节,具体来说,可以更改源。
    • 如果您决定这样做,请注意您的测试将测试与应该测试的类稍有不同的东西。这可能会导致测试覆盖率出现漏洞。
    • @AdrianMouat 如果这是一个单元测试,我们应该能够假设我们可以创建完全单独测试的类。如果是这样,我们应该可以简单地做: new Clazz() { /* put override here */ } 这意味着源不需要改变
    【解决方案2】:

    你为什么要这样做?

    您可以使用方面在字节码级别拦截代码(不明智);你可以接收一个调用 bar 的对象:void foo(MyBarObject m) { a += "xyx"; m.bar(); }

    但是,正如我所说,我想不出这为什么有用。单元测试旨在测试公共接口。如果 bar() 是私有的或受保护的,那么它会通过您的调用自动测试,然后是对 foo() 的断言。如果 foo() 和 bar() 都是公共的,那么酷,单独测试它们。

    你能发布一个真实的例子吗?你能改变被测代码吗?等等。

    【讨论】:

      【解决方案3】:

      有人可能会争辩说,上面的示例不是可测试的代码。相反,如果代码是:

      void foo() {
        a += "xyx";
      }
      
      void bar() {
        a += "abc";
      }
      
      void fooBar() {
        foo();
        bar();
      }
      

      单元测试很容易。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-05-25
        • 1970-01-01
        • 2016-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-20
        相关资源
        最近更新 更多