当前位置:  开发笔记 > 编程语言 > 正文

如何用最终方法嘲笑一个类?

如何解决《如何用最终方法嘲笑一个类?》经验,为你挑选了1个好方法。

说我有A级

class A {
  final String foo() {
    // .. computing result, contacting database, whatever ..
    return "some computed value";
  }
  // ... and a bazillion other methods, some of them final.
}

现在我有B级

class B {
  String methodIWantToTest(A a) {
      String output = a.foo();
      // ... whatever this method does, e.g.:
      output += "_suffix";
      return output;
  }
}

我如何进行单元测试这种方法?原因foo()是final是因为我们不希望扩展A的类改变其功能.但同时要对方法进行真正的单元测试,我不希望它伸出并运行实际的A.foo()方法.

有没有办法,比如说,删除最终的关键字,并添加一个注释@finalUnlessTest?你会推荐什么?重构A到一个接口将是非常非常困难的,看它是如何它是我们的中心类之一,并且不幸的非常非常耦合.

编辑#1抱歉,忘记提及,我们正在谈论Java.我们还没有使用模拟框架.

回答好的,所以:哇.JMockit是令人难以置信的,在我看来是测试遗留代码的杀手级应用程序.特别是在我的情况下,令人难以置信的有用.非常感谢!你基本上会为我的psuedo-example执行类似下面的操作:

class AMock {
   final String foo() {
     return "myTestValue";
   }
}
class Test extends TestCase {
   A mockedA;
   B b;
   protected void setUp() {
      Mockit.redefineMethods( A.class, AMock.class );  // this "pipes" all mocked methods from A to AMock
      mockedA = new A();    // NOT new AMock()!!!
      b = new B();
   }
   public void testB() {
      assertEquals("myTestValue",mockedA.foo());
      assertEquals("myTestValue_suffix",b.methodIWantToTest(mockedA));
   }
}

这个frickin'酷还是什么?



1> Jacek Szymań..:

您可以尝试使用JMockit模拟库.

推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有