mercredi 4 mai 2016

Trying to mock FileWriter throws NullPointerException

I am trying to mock FileWriter and BufferedWriter constructor APIs. Whenever I try to mock FileWriter API, I see a NPE exception in my stack trace. I don't know what I am doing wrong, and I hope that someone can help.

The exception stack trace is given below.

java.lang.NullPointerException
at java.io.Writer.<init>(Writer.java:99)
at java.io.OutputStreamWriter.<init>(OutputStreamWriter.java:115)
at java.io.FileWriter.<init>(FileWriter.java)
at com.boa.service.EmployeeServiceTest.writeToFile(EmployeeServiceTest.java:206)
at com.boa.service.EmployeeServiceTest.testWriteToFile_Success(EmployeeServiceTest.java:201)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.lang.reflect.Method.invoke(Method.java:613)

The source code is given below:

  void writeToFile(String filename, Set<Employees> employees) {        
    try(
        Writer writer = new FileWriter(filename);
        BufferedWriter writer = new BufferedWriter(writer);) {
        for (Employee employee : employees) {
            StringBuilder sb = new StringBuilder();
            sb.append(employee.getLastName()).append(", ").
                append(employee.getFirstName()).append("\n");
            writer.write(sb.toString());
        }
    } catch (IOException e) {
      throw new IOException(
         "unable to write to file : " + filename, e);
    }
  }

My Unit test is given below

  @Test
  public void testWriteToFile_Success()
      throws Exception {
    FileWriterMock wMock = new FileWriterMock();
    BufferedWriterMock bwMock = new BufferedWriterMock();
    Employee employee = new Employee("firstName", "lastName");
    Set<Employee> employees = new TreeSet<>();
    employees(employee);
    this.writeToFile("test-filename.csv", employees);     
  }

class FileWriterMock extends MockUp<FileWriter> {
    String filename;
    @Mock
    public void $init(String filename) {
      System.out.println("writer constructor");
      this.filename = filename;
    }
  }

  class BufferedWriterMock extends MockUp<BufferedWriter> {

    private int writerCount = 0;


    public int getWriterCount() {
      return writerCount;
    }

    @Mock
    public void $init(Writer writer) {
      System.out.println("buffered writer constructor");
    }

    @Mock
    public void write(String str) {
      this.writerCount ++;
    }
  }

I have tried to use jMockit's Faking Tutorials in this example. However, I don't know what I am doing wrong. Any advice would be gratefully appreciated.

Thanks

Aucun commentaire:

Enregistrer un commentaire