我认为只有当子类的方法与超类的方法不同时,PowerMock 才有可能实现这一点(即,如果子类覆盖该方法,则不能模拟父方法)。有关更多详细信息,您可以查看相关的错误报告。
对于 PowerMock,请查看Suppressing Unwanted Behavior 页面,看看它是否足以满足您的需求。
经过大量的挖掘,我最终将JMockit用于这些棘手的案例。在我继续使用 JMockit 之前,我尝试使用抑制将所有抛出异常的地方存根。最后,我需要重写一些方法,而不仅仅是压制它们,所以我最终放弃了它。
Android 案例的示例用法:
@MockClass
首先,您使用注释模拟您的超类:
@MockClass(realClass = Activity.class, instantiation = PerMockedInstance)
public class FakeActivity {
public Bundle mSavedInstanceState;
@Mock
public void $init() {}
@Mock
public void onCreate(Bundle savedInstanceState) {
mSavedInstanceState = savedInstanceState;
}
}
激活后,该类将替换默认构造函数Activity
with $init()
,并将onCreate
方法替换为上述方法。对于 android,被测单元是从 Activity 派生的(在我的示例代码中,它是HelloTestActivity
)。测试类如下所示:
public class HelloTestActivityTest3 extends AndroidTest {
@Tested
HelloTestActivity activity;
FakeActivity fakeActivity = new FakeActivity();
@Before
public void setupMocks()
{
Mockit.setUpMock(fakeActivity);
}
@Test
public void onCreate_bundle(@Mocked Bundle savedInstanceState)
{
// Try to access out-of-band information from the fake
activity.onCreate(savedInstanceState);
assertSame(savedInstanceState, fakeActivity.mSavedInstanceState);
}
}
该调用Mockit.setupMock(fakeActivity)
用我的假实例替换了超类。通过这种用法,您也可以访问假类的内部状态。如果您不需要使用自定义功能覆盖任何方法,则可以使用Mockit
类中可用的其他方法。
正如 rogerio 在下面的评论中指出的那样,模拟Activity
课程是最低限度的。下面的代码演示了这一点。
public class HelloTestActivityTest4 {
@Tested
HelloTestActivity activity;
@Mocked
Activity base;
@Test
public void testOnCreate() throws Exception {
// Just make sure "Stub!" exception is not thrown.
activity.onCreate(null);
}
}
该声明@Mocked Activity base;
导致Activity
类及其超类的所有方法(静态初始化程序除外)在HelloActivityTest4
.