带有Mockito的PowerMock不';t为构造函数调用创建模拟
我试图在每次创建FileOutputStream的任何构造函数时使用PowerMock和mockito来创建mock,但它似乎返回一个真实的实例,而不是模拟的实例 我的测试班:带有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
@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