java - 我可以使用 Mockito/Powermock 模拟父类(super class)的构造函数吗?

标签 java inheritance mockito superclass powermock

是否有可能使用 Mockito 和可选的 Powermock 来模拟父类(super class) S,这样对父类(super class)的任何调用都对 S(包括对 S() 的调用 构造函数)被 mock 了吗?因此,使用下面的示例,如果我使用 Mockito 将 S 替换为 MockS,那么对 super() 的调用是否会使用 中的构造函数MockS?

class S {
   S() {
      // Format user's hard drive, call 911, and initiate self-destruct
   }
}

class T extends S {
   T() {
      super();
   }
}

class Test {
   @Mock private S mockS;
   new T(); // T's call to super() should call the mock, not the destructive S.
}

我看到过有关在 S 中模拟单个方法或仅模拟对 super() 的调用的问题,并且读到这是不受支持的,但不清楚是否不是我可以 mock 整个父类(super class)。

在我当前的测试中,当我尝试模拟 S 时,Tsuper() 的调用会调用真正的实现,而不是模拟。

最佳答案

为了解决这个明显的限制,我重构了我的代码,replacing inheritance with delegation ,而且我认为我最终得到了一个更好的设计,因为继承并不是真正必要的。

新代码如下所示。请注意,问题的代码已简化,因此真正的类具有更多功能。

class S {
   S() {
      // Format user's hard drive, call 911, and initiate self-destruct
   }
}

class T {
   T(S s) {} // Now T "has an S" instead of "is an S"
}

class Test {
   @Mock private S mockS;
   new T(s); // T's call to super() should call the mock, not the destructive S.
}

对于那些有兴趣的人,使用 Guice 和 Android,测试看起来更像这样:

class T {
   T(Activity activity, S s) {}
}

class Test {
  @Mock Activity activity;
  @Mock S mockS;
  injector = Guice.createInjector(new AbstractModule() {
     @Override protected void configure() {
        bind(Activity.class).toInstance(activity);
        bind(S.class).toInstance(mockS);
     }}
  );
  T t = injector.getInstance(T.class);
}

关于java - 我可以使用 Mockito/Powermock 模拟父类(super class)的构造函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9957102/

相关文章:

c# - 自定义属性是否可以在没有继承的情况下暗示其他属性?

java - Mockito RETURNS_SMART_NULLS 回答奇怪的行为

java - 为 keystore.load(InputStream,password) 编写测试用例

Java 实时聊天开源

java - Jetty setInitParameter 没有初始化任何参数

c++ - 一个Derived类需要多少空间?如果它本身和它的基类都有虚方法?

python - 在方法调用中获取当前类

Java 1.7 : synchronize(this) faster than synchronize void

java - OpenJDK开发JavaEE?

java - Junit 测试类失败