带有Mockito的PowerMock不';t为构造函数调用创建模拟

带有Mockito的PowerMock不';t为构造函数调用创建模拟,mockito,powermock,powermockito,Mockito,Powermock,Powermockito,我试图在每次创建FileOutputStream的任何构造函数时使用PowerMock和mockito来创建mock,但它似乎返回一个真实的实例,而不是模拟的实例 我的测试班: @RunWith(PowerMockRunner.class) @PrepareForTest({FileOutputStream.class,FilesHelper.class}) public class FilesHelperTest { @Test public void createFileFromInpu

我试图在每次创建FileOutputStream的任何构造函数时使用PowerMock和mockito来创建mock,但它似乎返回一个真实的实例,而不是模拟的实例

我的测试班:

@RunWith(PowerMockRunner.class)
@PrepareForTest({FileOutputStream.class,FilesHelper.class})
public class FilesHelperTest {


@Test
public void createFileFromInputStream_validate_null_progress_subject_doesnt_throws_null_pointer() throws Exception {
    FileOutputStream fileOutputStream = Mockito.mock(FileOutputStream.class);
    PowerMockito.whenNew(FileOutputStream.class).withAnyArguments().thenReturn(fileOutputStream);
    File file = Mockito.mock(File.class);
    BufferedSource bufferedSource = Mockito.mock(BufferedSource.class);
    Mockito.doReturn(true).when(file).exists();
    Mockito.when(bufferedSource.read(Mockito.any(),Mockito.anyLong())).thenReturn(15L,-1L);
    FilesHelper.createFileFromInputStream(file,bufferedSource,8,null);
 }
}
我的班级在测试中-

public class FilesHelper {

/**
 * Creates a file out of an input stream wrapped by Okio's {@link BufferedSource}.
 * @param file a file to save the input to
 * @param bufferedSource the source input.
 * @param maxSize the maximum amount of bytes can be loaded to memory
 * @param progressUpdatePublisher an optional update publisher which notifies the writing progress
 * @return a {@link com.bonimoo.wominstaller.data.entities.BaseDownloadStatusDTO.Done} status with all the necessary information.
 * @throws IOException in case of errors while writing
 * @throws IllegalStateException when the file doesn't exists and cannot be created
 */
public static BaseDownloadStatusDTO.Done createFileFromInputStream(File file, BufferedSource bufferedSource, int maxSize, @Nullable PublishSubject<BaseDownloadStatusDTO> progressUpdatePublisher) throws IOException, IllegalStateException {
    if (!file.exists()) {
        Throwable cause = null;
        boolean created = false;
        try {
            created = file.createNewFile();
        } catch (IOException e) {
            cause = e;
        }
        if (!created) {
            throw new IllegalStateException("FilesHelper cannot create new file",cause);
        }
    }
    if (progressUpdatePublisher != null) {
        progressUpdatePublisher.onNext(new BaseDownloadStatusDTO.Started(file.getAbsolutePath()));
    }
    BufferedSink sink = Okio.buffer(Okio.sink(file));
    Buffer buffer = new Buffer();
    long counter = 0L;
    try {
        for (long readCount = bufferedSource.read(buffer, maxSize); readCount > -1 || bufferedSource.exhausted(); readCount = bufferedSource.read(buffer, maxSize)) {
            sink.writeAll(buffer);
            counter += readCount;
            if (progressUpdatePublisher != null) {
                progressUpdatePublisher.onNext(new BaseDownloadStatusDTO.Progress(counter,file.getAbsolutePath(),readCount));
            }
        }
    } finally {
        sink.flush();
        sink.close();
        buffer.close();
        bufferedSource.close();
    }
    return new BaseDownloadStatusDTO.Done(file);
 }
}
公共类文件帮助器{
/**
*从Okio的{@link BufferedSource}包装的输入流中创建一个文件。
*@param file保存输入的文件
*@param bufferedSource源输入。
*@param maxSize可加载到内存的最大字节数
*@param progressUpdatePublisher一个可选的更新发布程序,用于通知写入进度
*@return a{@link com.bonimoo.womsinstaller.data.entities.BaseDownloadStatusDTO.Done}状态以及所有必要的信息。
*@在写入时出错时引发IOException
*@在文件不存在且无法创建时引发IllegalStateException
*/
public static BaseDownloadStatusDTO.Done createFileFromInputStream(文件文件,BufferedSource BufferedSource,int maxSize,@Nullable PublishSubject progressUpdatePublisher)引发IOException,IllegalStateException{
如果(!file.exists()){
可丢弃原因=空;
布尔值=假;
试一试{
created=file.createNewFile();
}捕获(IOE异常){
原因=e;
}
如果(!已创建){
抛出新的非法状态异常(“FileHelper无法创建新文件”,原因);
}
}
if(progressUpdatePublisher!=null){
progressUpdatePublisher.onNext(新的BaseDownloadStatusDTO.Started(file.getAbsolutePath());
}
BufferedSink sink=Okio.buffer(Okio.sink(文件));
缓冲区=新缓冲区();
长计数器=0L;
试一试{
for(long readCount=bufferedSource.read(buffer,maxSize);readCount>-1 | | | bufferedSource.defined();readCount=bufferedSource.read(buffer,maxSize)){
sink.writeAll(缓冲区);
计数器+=读取计数;
if(progressUpdatePublisher!=null){
progressUpdatePublisher.onNext(新的BaseDownloadStatusDTO.Progress(计数器,file.getAbsolutePath(),readCount));
}
}
}最后{
下沉。冲洗();
sink.close();
buffer.close();
bufferedSource.close();
}
返回新的BaseDownloadStatusDTO.Done(文件);
}
}
因此,当我创建类时,我仍然会得到由实际构造函数调用引发的null指针异常

java.lang.NullPointerException
    at java.io.FileOutputStream.<init>(FileOutputStream.java:203)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:162)
    at okio.Okio.sink(Okio.java:181)
    at com.bonimoo.wominstaller.data.helpers.FilesHelper.createFileFromInputStream(FilesHelper.java:49)
    at com.bonimoo.wominstaller.data.helpers.FilesHelperTest.createFileFromInputStream_validate_null_progress_subject_doesnt_throws_null_pointer(FilesHelperTest.java:36)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:68)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:326)
    at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:89)
    at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:97)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:310)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:131)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.access$100(PowerMockJUnit47RunnerDelegateImpl.java:59)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner$TestExecutorStatement.evaluate(PowerMockJUnit47RunnerDelegateImpl.java:147)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.evaluateStatement(PowerMockJUnit47RunnerDelegateImpl.java:107)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:82)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:298)
    at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:87)
    at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:50)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:218)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:160)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:134)
    at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34)
    at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:136)
    at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:117)
    at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:57)
    at org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:59)
    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(JUnitStarter.java:242)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
java.lang.NullPointerException
位于java.io.FileOutputStream。(FileOutputStream.java:203)
位于java.io.FileOutputStream。(FileOutputStream.java:162)
在okio.okio.sink(okio.java:181)
位于com.bonimoo.womsInstaller.data.helpers.fileHelper.createFileFromInputStream(fileHelper.java:49)
在com.bonimoo.womsInstaller.data.helpers.filehelpertest.createFileFromInputStream\u validate\u null\u progress\u subject\u doesnt\u throws\u null\u指针(FilesHelperTest.java:36)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:498)
位于org.junit.internal.runners.TestMethod.invoke(TestMethod.java:68)
位于org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:326)
位于org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:89)
位于org.junit.internal.runners.MethodRoadie.runbeforesthentestthenuter(MethodRoadie.java:97)
位于org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:310)
位于org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:131)
在org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.access$100(PowerMockJUnit47RunnerDelegateImpl.java:59)
位于org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner$TestExecutorStatement.evaluate(PowerMockJUnit47RunnerDelegateImpl.java:147)
位于org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.evaluateStatement(PowerMockJUnit47RunnerDelegateImpl.java:107)
位于org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:82)
位于org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runbeforesthenTesttheAfter(PowerMockJUnit44RunnerDelegateImpl.java:298)
位于org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:87)
位于org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:50)
位于org.powermock.modules.junit4.internal.impl.powermockjunit44runnerdelegateinpl.invokeTestMethod(powermockjunit44runnerdelegateinpl.java:218)
位于org.powermock.modules.junit4.internal.impl.powermockjunit44runnerdelegateinpl.runMethods(powermockjunit44runnerdelegateinpl.java:160)
位于org.powermock.modules.junit4.internal.impl.powermockjunit44runnerdelegateinpl$1.run(powermockjunit44runnerdelegateinpl.java:134)
位于org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34)
位于org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44)
位于org.powermock.modules.junit4.internal.impl.powermockjunit44runnerdelegateinpl.run(powermockjunit44runnerdelegateinpl.java:136)
位于org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:117)
在org.powermock.modules.jun