Java 将 Mockito 与 PowerMock 一起使用时初始化异常错误

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/20657630/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-13 03:22:34  来源:igfitidea点击:

Initializing Exception error when using Mockito with PowerMock

javamockingmockitopowermock

提问by Global Dictator

I'm using Mockito with PowerMock for the first time and I'm having an error when running the below code at the following line:

我第一次将 Mockito 与 PowerMock 一起使用,在以下行运行以下代码时出现错误:

MockitoAnnotations.initMocks(SearchTest.class);

The error is:

错误是:

java.lang.ExceptionInInitializerError
    at org.mockito.internal.exceptions.stacktrace.ConditionalStackTraceFilter.<init>(ConditionalStackTraceFilter.java:17)
    at org.mockito.exceptions.base.MockitoException.filterStackTrace(MockitoException.java:30)
    at org.mockito.exceptions.base.MockitoException.<init>(MockitoException.java:19)
    at org.mockito.exceptions.misusing.MockitoConfigurationException.<init>(MockitoConfigurationException.java:18)
    at org.mockito.internal.configuration.ClassPathLoader.loadImplementations(ClassPathLoader.java:145)
    at org.mockito.internal.configuration.ClassPathLoader.findPluginImplementation(ClassPathLoader.java:110)
    at org.mockito.internal.configuration.ClassPathLoader.findPlatformMockMaker(ClassPathLoader.java:106)
    at org.mockito.internal.configuration.ClassPathLoader.<clinit>(ClassPathLoader.java:59)
    at org.mockito.internal.configuration.GlobalConfiguration.createConfig(GlobalConfiguration.java:38)
    at org.mockito.internal.configuration.GlobalConfiguration.<init>(GlobalConfiguration.java:32)
    at org.mockito.MockitoAnnotations.initMocks(MockitoAnnotations.java:94) 
Caused by: java.lang.NullPointerException

The code for the test class is:

测试类的代码是:

    import org.apache.http.HttpEntity;
    import org.apache.http.HttpResponse;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.methods.HttpPost;
    import org.junit.Assert;
    import org.junit.BeforeClass;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.junit.runners.Parameterized.Parameters;
    import org.mockito.Matchers;
    import org.mockito.Mock;
    import org.mockito.Mockito;
    import org.mockito.MockitoAnnotations;
    import org.powermock.api.mockito.PowerMockito;
    import org.powermock.core.classloader.annotations.PrepareForTest;
    import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(Parameterized.class)
@PrepareForTest(InputStreamReader.class)

public class SearchTest {   
    private String preFile;
    private String expectedPreFile;
    private String postFile;
    private String expectedpostFile;

    @Parameters
    public static Collection<Object[]> data() {
        return Arrays.asList(new Object[][] {    
        { "test1" } });
    }

    @Mock
    private HttpClient mockHttpClient;
    private HttpPost mockHttpPost;
    private HttpResponse mockHttpResponse;
    private HttpEntity mockHttpEntity; 
    private InputStream mockInputStream;
    private InputStreamReader mockInputStreamReader;
    private BufferedReader mockBufferedReader;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
        xstream = new XStream();
    }


    public SearchTest(String folder) {
        this.preFile= folder + "/inpRows.json";
        this.expectedPreFile= folder + "/inpRowsExpected.json";
        this.postFile= folder + "/outRows.json";
        this.expectedpostFile= folder + "/outRowsExpected.json";
    }

    @Test
    /**
     * Simulates the calling of a handler    * 
     * Setup @Parameters with a list of folders containing the test files.  A test is performed for each entry
     * @throws CallbackHandlerException
     * @throws IOException
     * @throws JSONException
     * @throws SecurityException
     * @throws NoSuchFieldException
     * @throws IllegalArgumentException
     * @throws IllegalAccessException
     */
    public void testHandler() throws Exception {

    /**********Set the expected results for the mocked methods****************/
        Mockito.when(mockHttpClient.execute(mockHttpPost)).thenReturn(mockHttpResponse); 
        Mockito.when(mockHttpResponse.getEntity()).thenReturn(mockHttpEntity);              
        Mockito.when(mockHttpEntity.getContent()).thenReturn(mockInputStream);
        PowerMockito.whenNew(InputStreamReader.class).withArguments(mockInputStream).thenReturn(mockInputStreamReader);
        PowerMockito.whenNew(BufferedReader.class).withArguments(mockInputStreamReader).thenReturn(mockBufferedReader);
        PowerMockito.whenNew(JSONObject.class).withArguments(Matchers.any(String.class)).thenReturn(jsonStub);

        searchHandler.pre(); //Call the actual Pre method to be tested

    }
}

Any suggestions why I'm getting this error?

任何建议为什么我会收到此错误?

Thanks

谢谢

采纳答案by czajek

Try to put initMocks in @Before instead of @BeforeClass method. What you are trying to do is to set some fields in a static method. That's my guess.

尝试将 initMocks 放在 @Before 而不是 @BeforeClass 方法中。您要做的是在静态方法中设置一些字段。这是我的猜测。