Цель: создать приложение stickynote с использованием TDD (о котором я недавно узнал и теперь активно сожалею)
Проблема: я ожидаю, что все «Заметки» будут сериализованы и десериализованы их отдельными классами. И я хочу использовать подход TDD, но я не могу даже протестировать удачный путь класса NoteReader (десериализатор), не говоря уже о угловых случаях.
Вот код:
package com.domainname.applicationname;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.List;
public class NoteReader {
private final FileInputStream fileInputStream;
public NoteReader(FileInputStream fileInputStream) {
this.fileInputStream = fileInputStream;
}
@SuppressWarnings("unchecked")
public List<Note> load() {
ObjectInputStream objectInputStream = null;
List<Note> output = null;
try {
objectInputStream = new ObjectInputStream(fileInputStream);
output = (List<Note>) objectInputStream.readObject();
objectInputStream.close();
} catch (ClassNotFoundException | IOException e) {
e.printStackTrace();
}
return output;
}
}
и вот код модульного тестирования:
package com.domainname.applicationname;
import org.junit.*;
import org.mockito.Mockito;
import java.io.*;
import java.util.Arrays;
import java.util.List;
public class NoteReaderTest {
private FileInputStream dummyFileInputStream;
private NoteReader noteReaderDummy;
private List<Note> expectedOutput = Arrays.asList(
new Note("some written text"),
new Note("some other written text", NoteColor.lightGreen)
);
private ByteArrayOutputStream byteArrayOutputStream;
private ObjectOutputStream objectOutputStream;
private byte[] bytesToBeDeserialized;
@Before
public void setUp() throws IOException {
dummyFileInputStream = Mockito.mock(FileInputStream.class);
noteReaderDummy = new NoteReader(dummyFileInputStream);
byteArrayOutputStream = new ByteArrayOutputStream();
objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
}
@After
public void tearDown() throws IOException {
noteReaderDummy = null;
byteArrayOutputStream.flush();
objectOutputStream.flush();
objectOutputStream.close();
}
@Test
public void shouldLoadTheListOfNotes() throws IOException {
//given
objectOutputStream.writeObject(expectedOutput);
bytesToBeDeserialized = byteArrayOutputStream.toByteArray();
int intValueOfByteArray = dummyFileInputStream.read(bytesToBeDeserialized);
//when
Mockito.when(
dummyFileInputStream.read()
).thenReturn(
intValueOfByteArray
);
//then
Assert.assertEquals(
"the notes have not been loaded",
expectedOutput,
noteReaderDummy.load()
);
}
}
У меня бесконечный цикл, и это сводит меня с ума.
Вопрос: Как проверить класс десериализации? Что я делаю не так в приведенном выше коде?