如何模拟单元测试的父类

时间:2012-07-22 22:39:45

标签: java unit-testing mocking

所以我有三个类:A,B,C。我需要为类A编写单元测试。

  class A extends B{
   //fields go here ...

   public A(String string, ...){
      super.(string,...);
   }
   //other methods here ...
 }

 class B{
   C stuff;
   //other stuff
 }

所以C是一个重要的资源(如JDBC或ssh Session)。当然,我在嘲笑C。我如何模仿B。想象一下B有许多扩展它的子类。

我的主要问题是A正在调用super.(...)。我不想仅仅为了测试而将方法注入A。对我来说这是糟糕的设计。有关如何嘲笑父母的任何想法吗?

例如,我无法class MockB extends B{...}然后尝试MockB obj = new A();这不起作用,因为MockBA都是B的孩子。

2 个答案:

答案 0 :(得分:7)

你真的不应该试图模拟被测试类的超类。虽然一些模拟框架允许“部分模拟”可能部分模拟你实际测试的类,但这是一个坏主意。

如果类A以及AB之间的关系足够复杂,您认为您需要这些,那么它们可能根本不应该属于继承关系。

考虑更改您的代码,以便B委托给A而不是扩展代码。

答案 1 :(得分:3)

你想要模拟B类,这意味着你可能没有测试B或A.所以你为什么要关心它是否称为super,foo,bar或其他方法?你知道jdbc调用了多少个方法吗?但正如你所说,你嘲笑它没有问题。同样在这里。你刚才做的

B mockOfB = Mockito.mock(B.class);

就是这样。你有一个B的模拟,你可以测试你喜欢的任何调用。

如果你正在测试A那么为什么你不能简单地实例化它? B的构造函数需要一些静态依赖吗?在这种情况下,你应该重构它或使用类似powermock的东西(如果你真的不能重构这个类)。如果你不能实例化B,因为它是抽象的,那么只需在你的测试中扩展它