代码之家  ›  专栏  ›  技术社区  ›  Bill Software Engineer

由于org.apache.http.StatusLine上的ExceptionInInitializerError,模拟CloseableHttpClient失败

  •  0
  • Bill Software Engineer  · 技术社区  · 3 年前

    我正在使用mockito来模拟httpclient,如下所示:

    public static CloseableHttpClient createRawHttpClient(int statusCode, String body)
            throws IOException {
        StatusLine mockStatus = Mockito.mock(StatusLine.class);
        when(mockStatus.getStatusCode()).thenReturn(statusCode);
        HttpEntity mockEntity = Mockito.mock(HttpEntity.class);
        when(mockEntity.getContent()).thenReturn(new ByteArrayInputStream(body.getBytes()));
        CloseableHttpResponse mockResponse = Mockito.mock(CloseableHttpResponse.class);
        when(mockResponse.getStatusLine()).thenReturn(mockStatus);
        when(mockResponse.getEntity()).thenReturn(mockEntity);
        CloseableHttpClient mockClient = Mockito.mock(CloseableHttpClient.class);
        when(mockClient.execute(any())).thenReturn(mockResponse);
        return mockClient;
    }
    

    在第一行,它抛出了这个错误:

    java.lang.ExceptionInInitializerError
        at org.mockito.cglib.core.KeyFactory$Generator.generateClass(KeyFactory.java:167)
        at org.mockito.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
        at org.mockito.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:217)
        at org.mockito.cglib.core.KeyFactory$Generator.create(KeyFactory.java:145)
        at org.mockito.cglib.core.KeyFactory.create(KeyFactory.java:117)
        at org.mockito.cglib.core.KeyFactory.create(KeyFactory.java:109)
        at org.mockito.cglib.core.KeyFactory.create(KeyFactory.java:105)
        at org.mockito.cglib.proxy.Enhancer.<clinit>(Enhancer.java:70)
        at org.mockito.internal.creation.cglib.ClassImposterizer.createProxyClass(ClassImposterizer.java:95)
        at org.mockito.internal.creation.cglib.ClassImposterizer.imposterise(ClassImposterizer.java:57)
        at org.mockito.internal.creation.cglib.ClassImposterizer.imposterise(ClassImposterizer.java:49)
        at org.mockito.internal.creation.cglib.CglibMockMaker.createMock(CglibMockMaker.java:24)
        at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:33)
        at org.mockito.internal.MockitoCore.mock(MockitoCore.java:59)
        at org.mockito.Mockito.mock(Mockito.java:1285)
        at org.mockito.Mockito.mock(Mockito.java:1163)
        at com.myproject.botcommand.mockService.MockServiceHelper.createRawHttpClient(MockServiceHelper.java:42)
        at com.myproject.botcommand.exceptions.HttpClientExceptionTest.ExceptionTest(HttpClientExceptionTest.java:22)
    

    原因如下:

    Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) throws java.lang.ClassFormatError accessible: module java.base does not "opens java.lang" to unnamed module @548a9f61
        at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:357)
        at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297)
        at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:199)
        at java.base/java.lang.reflect.Method.setAccessible(Method.java:193)
        at org.mockito.cglib.core.ReflectUtils$2.run(ReflectUtils.java:57)
        at java.base/java.security.AccessController.doPrivileged(AccessController.java:312)
        at org.mockito.cglib.core.ReflectUtils.<clinit>(ReflectUtils.java:47)
        ... 85 more
    

    是什么原因造成的?它无法模拟StatusLine,因为它受到保护?是因为我的java版本吗?

    我正在使用jdk 16.0.1

    0 回复  |  直到 3 年前