Java 试图模拟FileWriter会引发NullPointerException

Java 试图模拟FileWriter会引发NullPointerException,java,unit-testing,jmockit,Java,Unit Testing,Jmockit,我试图模拟FileWriter和BufferedWriter构造函数API。每当我尝试模拟FileWriter API时,我都会在堆栈跟踪中看到NPE异常 下面给出了异常堆栈跟踪 java.lang.NullPointerException at java.io.Writer.<init>(Writer.java:99) at java.io.OutputStreamWriter.<init>(OutputStreamWriter.java:115) at java.io

我试图模拟FileWriter和BufferedWriter构造函数API。每当我尝试模拟FileWriter API时,我都会在堆栈跟踪中看到NPE异常

下面给出了异常堆栈跟踪

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)
java.lang.NullPointerException
在java.io.Writer(Writer.java:99)
位于java.io.OutputStreamWriter(OutputStreamWriter.java:115)
位于java.io.FileWriter.(FileWriter.java)
位于com.boa.service.EmployeeServiceTest.writeToFile(EmployeeServiceTest.java:206)
在com.boa.service.EmployeeServiceTest.testWriteToFile_Success上(EmployeeServiceTest.java:201)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于java.lang.reflect.Method.invoke(Method.java:613)
源代码如下所示:

  void writeToFile(String filename, Set<Employee> employees) throws Exception {        
    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);
    }
  }
void writeToFile(字符串文件名,设置雇员)引发异常{
试一试(
Writer Writer=新文件编写器(文件名);
BufferedWriter=新的BufferedWriter(writer);){
用于(员工:员工){
StringBuilder sb=新的StringBuilder();
sb.append(employee.getLastName()).append(“,”)。
append(employee.getFirstName()).append(“\n”);
写(某人写的东西);
}
}捕获(IOE异常){
抛出新IOException(
“无法写入文件:”+文件名,e);
}
}
下面给出了我的单元测试

  @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.add(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 ++;
    }
  }
@测试
public void testWriteToFile_Success()
抛出异常{
FileWriterMock wMock=新的FileWriterMock();
BufferedWriterMock bwMock=新的BufferedWriterMock();
员工=新员工(“名”、“姓”);
Set employees=new TreeSet();
employees.add(employees);
此.writeToFile(“test filename.csv”,雇员);
}
类FileWriterMock扩展了实体模型{
字符串文件名;
@嘲弄
public void$init(字符串文件名){
System.out.println(“编写器构造函数”);
this.filename=文件名;
}
}
类BufferedWriterMock扩展了实体模型{
私有int writerCount=0;
public int getWriterCount(){
返回写计数;
}
@嘲弄
public void$init(编写器){
System.out.println(“缓冲编写器构造函数”);
}
@嘲弄
公共空写(字符串str){
this.writeCount++;
}
}

我尝试在这个例子中使用。然而,我不知道我做错了什么。我正在将TestNG插件与eclipse一起使用。

请调试您的代码,我已经尝试过了,您会遇到问题的。我在这里发帖是因为我不明白为什么会发生这种情况。在提问时,你应该提供工作代码。在上面的代码中,a)您有两个名为
writer
的不同类的变量,b)您的方法没有声明为抛出IOException,尽管这样做了,c)您没有为
员工提供定义,d)您有一个
集合
,我认为应该是
集合
。简而言之,这充其量只是伪代码,可能无法可靠地复制您的问题。这是一个糟糕的复制粘贴工作,对此我深表歉意。但是代码是有效的。请调试你的代码,你会遇到问题的。我已经试过了。我在这里发帖是因为我不明白为什么会发生这种情况。在提问时,你应该提供工作代码。在上面的代码中,a)您有两个名为
writer
的不同类的变量,b)您的方法没有声明为抛出IOException,尽管这样做了,c)您没有为
员工提供定义,d)您有一个
集合
,我认为应该是
集合
。简而言之,这充其量只是伪代码,可能无法可靠地复制您的问题。这是一个糟糕的复制粘贴工作,对此我深表歉意。但代码是有效的。