是否有可能使用 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
时,T
对 super()
的调用会调用真正的实现,而不是模拟。
最佳答案
为了解决这个明显的限制,我重构了我的代码,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/