Junit mocking files using jmockit

Fotis :

I am trying to test my java code using jmockit for the first time and I am really confused. I have a method that reads a file and returns the line of strings that reads from the file as a list.

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Reader {
    public static final int LIMIT = -1;
    public static final int EMPTY_FILE = 0;
    private String delimiter = ",";

    
    public Reader() {}

    public List<List<String>> readFile(String fileName, String delimiter) throws IOException {
        List<List<String>> rawData = new ArrayList<>();

        File input = new File(fileName);

        if (!delimiter.isEmpty())
            this.delimiter = delimiter;

        if (input.length() == EMPTY_FILE) {
            throw new IOException("File is empty. Check file and try again.");
        }

        BufferedReader reader = new BufferedReader(new FileReader(input));

        String line;

        while ((line = reader.readLine()) != null) {
            List<String> lineData = Arrays.asList(line.split(this.delimiter, LIMIT));
            rawData.add(lineData);
        }
        return rawData;
    }
}

I am trying to test this code using mocked readers and bufferedReader but without any luck. Obviously I am doing something wrong but I can't figure out how to do it properly.

What I want is to create a mocked file that will be read and test it like its empty or non empty.

What I have tried so far :

class ReaderTest {
    static final String FILENAME = "input.txt";

    @Injectable
    File mockedFile;

    @Mocked
    BufferedReader mockedBufferedReader;

    @Mocked
    FileReader mockedFileReader;

    @Test
    void readNonEmptyInputFileShouldDoNothing() throws FileNotFoundException {
        new Expectations(File.class) {{
            new File(anyString);
            result = mockedFile;
        }};

        new Expectations(BufferedReader.class) {{
            new FileReader(anyString);
            result = mockedFileReader;

            new BufferedReader(mockedFileReader);
            result = mockedBufferedReader;
        }};
        Reader reader = new Reader();

        Assertions.assertDoesNotThrow(() ->
                reader.readFile(FILENAME, FieldsConstants.DELIMITER));
    }
}

This test gives me an IllegalArgumentException error: Invalid Class argument for partial mocking (use a MockUp instead): class java.io.File

Fotis :

I managed to solve my issue using PowerMock and EasyMock API. The only issue i faced was that in the beginning i was using Junit5 and PowerMock wasn't working as intended. I switched to Junit4 and everything worked out just fine. Just some sample code if anyone is interested:

@RunWith(PowerMockRunner.class)
@PrepareForTest({Reader.class})
@PowerMockIgnore({"javax.management.*", "javax.script.*"})
public class ReaderTest {
    public static final String TEST_LINE = "2,Ned,Flanders,SELLER,,,LINE_A,Springfield,12.8,TRUE";
    public static final String FILENAME = "file_name";
    public static final int LIMIT = -1;

    private static List<List<String>> tmpList;

    @BeforeClass
    public static void beforeAll() {
        List<String> tmpLine = Arrays.asList(TEST_LINE.split(FieldsConstants.DELIMITER, LIMIT));
        tmpList = new ArrayList<>();
        tmpList.add(tmpLine);
    }

    @Test
    public void readNonEmptyInputFileShouldDoNothing() throws Exception {
        File mockFile = createMockAndExpectNew(File.class, FILENAME);
        FileReader mockFileReader = createMockAndExpectNew(FileReader.class, mockFile);
        BufferedReader mockBufferedReader = createMockAndExpectNew(BufferedReader.class, mockFileReader);

        Reader reader = new Reader();

        expect(mockFile.length()).andReturn((long) 100);

        expect(mockBufferedReader.readLine()).andReturn(TEST_LINE);
        expect(mockBufferedReader.readLine()).andReturn(null);

        replayAll();

        assertEquals(reader.readFile(FILENAME, ""), tmpList);
        verifyAll();
    }
}

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related

TOP Ranking

  1. 1

    Failed to listen on localhost:8000 (reason: Cannot assign requested address)

  2. 2

    Loopback Error: connect ECONNREFUSED 127.0.0.1:3306 (MAMP)

  3. 3

    How to import an asset in swift using Bundle.main.path() in a react-native native module

  4. 4

    pump.io port in URL

  5. 5

    Compiler error CS0246 (type or namespace not found) on using Ninject in ASP.NET vNext

  6. 6

    BigQuery - concatenate ignoring NULL

  7. 7

    ngClass error (Can't bind ngClass since it isn't a known property of div) in Angular 11.0.3

  8. 8

    ggplotly no applicable method for 'plotly_build' applied to an object of class "NULL" if statements

  9. 9

    Spring Boot JPA PostgreSQL Web App - Internal Authentication Error

  10. 10

    How to remove the extra space from right in a webview?

  11. 11

    java.lang.NullPointerException: Cannot read the array length because "<local3>" is null

  12. 12

    Jquery different data trapped from direct mousedown event and simulation via $(this).trigger('mousedown');

  13. 13

    flutter: dropdown item programmatically unselect problem

  14. 14

    How to use merge windows unallocated space into Ubuntu using GParted?

  15. 15

    Change dd-mm-yyyy date format of dataframe date column to yyyy-mm-dd

  16. 16

    Nuget add packages gives access denied errors

  17. 17

    Svchost high CPU from Microsoft.BingWeather app errors

  18. 18

    Can't pre-populate phone number and message body in SMS link on iPhones when SMS app is not running in the background

  19. 19

    12.04.3--- Dconf Editor won't show com>canonical>unity option

  20. 20

    Any way to remove trailing whitespace *FOR EDITED* lines in Eclipse [for Java]?

  21. 21

    maven-jaxb2-plugin cannot generate classes due to two declarations cause a collision in ObjectFactory class

HotTag

Archive