Издеваться над файлом произвольного доступа

У меня есть код, где я использую файл произвольного доступа для записи файла. Для тестирования этой функции я пытаюсь проверить, происходит вызов 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)

2 ответа

Решение

В этом коде вы пытаетесь смоделировать последний метод, который не будет работать с Mockito. Последний метод writeBytes() будет вызван без какого-либо предупреждения. Вы можете использовать PowerMock для проверки конечных методов или реорганизовать исходный код для внедрения собственной тестовой реализации RandomAccessFile, Таким образом, вы можете избежать тестирования стороннего кода.

Вы можете использовать правило TemporaryFolder JUnit и использовать реальный файл вместо макета.

Другие вопросы по тегам