Mockito - 模拟 Context 和 getApplicationContext()

Asa*_*afK 7 java android unit-testing mockito powermock

刚刚开始为我的应用程序创建 UT,并使用 PowerMock、Mockito 和 Junit4。我有一个非常基本的问题,即模拟 Context 和 getApplicationContext()。我似乎无法理解如何做到这一点。

到目前为止我尝试的是以下内容:

@Before
public void setUp() throws Exception {
    mContext = Mockito.mock(Context.class);
    Mockito.when(mContext.getApplicationContext()).thenReturn(mContext);

    PowerMockito.whenNew(IabHelper.class).withAnyArguments().thenReturn(new IabHelperMock(mContext, null));
}
Run Code Online (Sandbox Code Playgroud)

当我使用调试器(Android Studio)并在下面的行上暂停时,一切运行正常,但是当我在没有调试器的情况下运行测试时,测试失败(因为同一行):

public IabHelper(Context ctx, String base64PublicKey) {
    mContext = ctx.getApplicationContext();
    ...
}
Run Code Online (Sandbox Code Playgroud)

我收到的失败消息是:

org.mockito.exceptions.misusing.UnfinishedStubingException:在此处检测到未完成的存根:-> 在 org.powermock.api.mockito.internal.invocation.MockitoNewInvocationControl.expectSubstitutionLogic(MockitoNewInvocationControl.java:65)
例如 thenReturn() 可能会丢失。
正确存根的例子:
when(mock.isOk()).thenReturn(true);
when(mock.isOk()).thenThrow(exception);
doThrow(exception).when(mock).someVoidMethod();
提示:
1. 缺少 thenReturn()
2. 你试图存根一个 final 方法,你这个顽皮的开发者!
3:如果完成,您正在'thenReturn'指令之前存根内部另一个模拟的行为
在 com.xxx.libs.components.purchase.util.IabHelper.(IabHelper.java:164)
在 com.xxx.libs.mocks.IabHelperMock.(IabHelperMock.java:22)
...

我显然做错了什么,我想知道究竟是什么。使用 Context 和 getApplicationContext() 的最佳实践是什么?谢谢。