2014-11-24 84 views
0

我有我在使用随机访问文件写入文件的代码..为了测试该功能,我试图验证writeBytes()调用是否发生..但是,因为我嘲笑随机访问文件..测试抛出和IO异常说'流关闭'..我想这可能是因为我嘲笑随机访问文件....任何建议/解决方法表示赞赏。嘲笑一个随机访问文件

@Test 
    public void testWriteGradesIntoFile_WriteFirstRecord() throws Exception { 
     final String firstRecord = new String(empID + "," + score); 

     PowerMockito.whenNew(File.class).withArguments(outputFileName + ".csv") 
       .thenReturn(outputFileMock); 
     PowerMockito.whenNew(RandomAccessFile.class) 
       .withArguments(outputFileMock, "rw").thenReturn(outputRAFMock); 

     PowerMockito.mockStatic(WriteGradeReportToCSV.class); 
     Mockito.when(WriteGradeReportToCSV.checkFileIsEmpty(outputRAFMock)) 
       .thenReturn(true); 

     Mockito.when(outputRAFMock.length()).thenReturn(fileLength); 
     Mockito.doNothing().when(outputRAFMock).seek(fileLength); 

     Mockito.when(gradeReportMock.getEmpId()).thenReturn(empID); 
     Mockito.when(gradeReportMock.getScore()).thenReturn(score); 

     Mockito.doNothing().when(outputRAFMock).writeBytes(firstRecord); 
     writeGradeToCSV.writeGradesIntoFile(gradeReportMock, outputFileName); 

     Mockito.verify(outputRAFMock, Mockito.times(1)).close(); 
    } 

它的功能如下:

File outputCSVFile = null; 
     RandomAccessFile outputRAF = null; 
     try { 
      outputCSVFile = new File(outputFileName + ".csv"); 
      if (outputCSVFile != null) { 
       outputRAF = new RandomAccessFile(outputCSVFile, "rw"); 
       if (checkFileIsEmpty(outputRAF)) { 
        // File is empty.Hence write the first record. 
        outputRAF.seek(outputRAF.length()); 
        outputRAF.writeBytes(new StringBuffer(gradeReport 
          .getEmpId() + "," + gradeReport.getScore()) 
          .toString()); 
        outputRAF.close(); 
      } 
     } 

故障跟踪如下:

java.io.IOException: Stream Closed 
    at java.io.RandomAccessFile.writeBytes0(Native Method) 
    at java.io.RandomAccessFile.writeBytes(RandomAccessFile.java:520) 
    at java.io.RandomAccessFile.writeBytes(RandomAccessFile.java:1123) 
    at com.cerner.devcenter.wag.util.WriteGradeReportToCSV_writeGradesIntoFileTest.testWriteGradesIntoFile_WriteFirstRecord(WriteGradeReportToCSV_writeGradesIntoFileTest.java:132) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:68) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:310) 
    at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:88) 
    at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:96) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:294) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:127) 
    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:282) 
    at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:86) 
    at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:49) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:207) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:146) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:120) 
    at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:33) 
    at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:45) 
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:118) 
    at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:104) 
    at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:53) 
    at org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:53) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189) 
    at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165) 
    at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85) 
    at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115) 
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75) 
+0

你能给我们一个堆栈跟踪,并确定从哪个行抛出异常? – 2014-11-24 22:10:55

回答

2

在这段代码中,你正在试图嘲笑一种不适用于Mockito的最终方法。最终的方法writeBytes()将被调用而没有任何警告。您可以使用PowerMock来模拟最终方法或重构您的原始代码,以注入您自己的测试实现RandomAccessFile。你几乎可以避免以这种方式测试第三方代码。

2

你可以使用JUnit的TemporaryFolder规则,并使用一个真正的文件,而不是一个模拟的。