【发布时间】:2011-09-22 11:37:23
【问题描述】:
我想在测试类的超类中创建一个方法,将一些常用方法存根在被测类中,但其中一些方法可能不存在。
例如,我有一个这样的类层次结构:
abstract class A {
void search(); // implemented by subclass
String getFoo() { return "REAL FOO"; }
}
class B extends A {
void search() {
getFoo();
}
}
class C extends A {
void search() {
getFoo();
getBar();
}
String getBar() { return "REAL BAR"; }
}
A 有很多子类(一个生成骨架的工具),因此我想创建一个超类以便于我进行测试:
abstract class AbstractSearchTest {
A underTest;
@Test void test() {
doReturn( "FOO" ).when( underTest ).getFoo();
doReturn( "BAR" ).when( underTest, "getBar" ); // THE PROBLEM!
underTest.search();
}
}
class BSearchTest extends AbstractSearchTest {
BSearchTest() {
underTest = new B();
}
}
class CSearchTest extends AbstractSearchTest {
CSearchTest() {
underTest = new C();
}
}
这基本上是说,“在调用 search() 之前,存根 getFoo()。哦,如果子类恰好有 getBar(),那么也存根它。”
但我不能这样做,因为它会抛出 org.powermock.reflect.exceptions.MethodNotFoundException。如何做到这一点?
【问题讨论】:
-
你为什么不把它转换成C?我假设 A B 和 C 都是模拟。 when((C)undertest.getBar).thenReturn("Bar");
-
我无法转换,因为代码在超类中(即由 B、C、D 等测试类共享)。