首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >org.mockito.exceptions.misusing.NotAMockException:参数应该是模拟的,但它是: Andriod SSLContext.getInstance()方法的java.lang.Class类

org.mockito.exceptions.misusing.NotAMockException:参数应该是模拟的,但它是: Andriod SSLContext.getInstance()方法的java.lang.Class类
EN

Stack Overflow用户
提问于 2020-07-05 23:33:53
回答 1查看 9.1K关注 0票数 11

我在安卓和PowerMock项目上工作。在这个例子中,我试图模拟下面的方法,但是我得到了错误

代码语言:javascript
复制
org.mockito.exceptions.misusing.NotAMockException: Argument should be a mock, but is: class java.lang.Class

    at com.ABCTest.testTrustAppCertificates(ABCTest.java:314)
    at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:68)
    at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:89)
    at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:97)
    at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:87)
    at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:50)
    at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34)
    at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
    at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitS

代码:

代码语言:javascript
复制
private void trustAppCertificates(boolean isTrustAll) {
    try {
        TrustManager[] trustAllCerts = // get the Trust Manager 
        SSLContext sc = SSLContext.getInstance("TLSv1.2"); // Line-4
        sc.init(null, trustAllCerts, new SecureRandom()); // Line-5
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
        HttpsURLConnection.setDefaultHostnameVerifier((arg0, arg1) -> isTrustAll);
    } catch (Exception e) {
        // LOG ERROR HERE
    }
}

测试用例:

代码语言:javascript
复制
@PowerMockIgnore({"org.apache.http.conn.ssl.*", "javax.net.ssl.*" , "javax.crypto.*"})
@Test
public void testTrustAppCertificates() throws Exception {
    ...
    ...
    ...
    PowerMockito.mockStatic(SSLContext.class);
    SSLContext sslContextMock = mock(SSLContext.class);
    PowerMockito.doNothing().when(sslContextMock).init(any(KeyManager[].class), any(TrustManager[].class), any(SecureRandom.class));

    PowerMockito.when(SSLContext.getInstance(anyString())).thenReturn(sslContextMock); // This line breaks and gives the error mentioned above
    when(sslContextMock.getSocketFactory()).thenReturn(sSLSocketFactoryMock);

    PowerMockito.verifyPrivate(mockClass).invoke("trustAppCertificates", true);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-06 02:56:40

您可以使用以下代码来解决此问题。希望这能对你有所帮助。请在线条下方替换

代码语言:javascript
复制
PowerMockito.when(SSLContext.getInstance(anyString())).thenReturn(sslContextMock);

使用

代码语言:javascript
复制
when(SSLContext.getInstance(anyString())).thenAnswer((Answer<SSLContext>) invocation -> sslContextMock);
票数 28
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62742777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档