ObjectInputStream测试的EOF异常



我正在尝试测试从ObjectInputStream读取对象的readObject方法

@Test
public void testReadObject() throws Exception {
ObjectInputStream in = new ObjectInputStream(System.in);
...
} 

我正在为ObjectInputStream in = new ObjectInputStream(System.in);中的ObjectInputStream获取java.io.EOFException

我是嘲笑ObjectInputStream还是这是一种糟糕的做法?在编写测试用例时,我该如何处理整个readObject场景?

我的员工类别:

public class Employee {
private Object Teacher;
...
private void readObject(java.io.ObjectInputStream in) throws Exception {
Teacher = in.readObject();
}
...
}

请注意,我使用的是JUnit和Mockito。

我的方法需要更多的测试代码,但它为您提供了一个在不嘲笑ObjectInputStream:的情况下编写测试的机会

@Test
void testReadObject() throws Exception {
String teacherObject = "TeacherObject";
final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
new ObjectOutputStream(outputStream).writeObject(teacherObject);
final Employee employee = new Employee();
employee.readObject(
new ObjectInputStream(
new ByteArrayInputStream(
outputStream.toByteArray()
)
)
);
assertEquals(teacherObject, employee.getTeacher());
}

注意:此测试是在两个假设下编写的:

  1. Employee类有一个方法getTeacher()。因为您需要以某种方式断言Teacher是从ObjectInputStream正确读取的。如果你有其他方法可以做到这一点——根据你的需要修改我的例子
  2. Employee.readObject()方法的可见性是公开的。这样做只是为了简化我的例子。在您的收件箱中,readObject()具有私人可见性。你可以根据需要修改我的例子,也可以给我更多的上下文,我可以相应地修改我的示例

完整源代码:

  1. Employee.java
package dev.iakunin.stackoverflow.question;
public class Employee {
private Object teacher;
public void readObject(java.io.ObjectInputStream in) throws Exception {
teacher = in.readObject();
}
public Object getTeacher() {
return teacher;
}
}
  1. EmployeeTest.java
package dev.iakunin.stackoverflow.question;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.logging.Level;
import java.util.logging.Logger;
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;
class EmployeeTest {
@Test
void testReadObject() throws Exception {
String teacherObject = "TeacherObject";
final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
new ObjectOutputStream(outputStream).writeObject(teacherObject);
final Employee employee = new Employee();
employee.readObject(
new ObjectInputStream(
new ByteArrayInputStream(
outputStream.toByteArray()
)
)
);
assertEquals(teacherObject, employee.getTeacher());
}
}

最新更新