Что я пытаюсь сделать
У меня есть серверный класс, у которого нет преднамеренных аргументов, и я хочу протестировать его с помощью Mockito.
Если вы хотите проверить полный исходный код на Github :
Server.class
public class Server extends Thread {
private Other other;
ObjectInputStream fromClient;
ObjectOutputStream toClient;
public Server(){
this.other = new Other(foo, bar);
}
@Override
public void run(){
try{
ServerSocket serverSocket = new ServerSocket(1337);
Socket socket = serverSocket.accept();
fromClient = new ObjectInputStream(socket.getInputStream());
toClient = new ObjectOutputStream(socket.getOutputStream());
while(true) {
int command = (Integer) fromClient.readObject();
switch (command) {
case 0x1:
//add
//...
break;
case 0x2:
//get server data
toClient.writeObject(other.getSomething());
break;
case 0x3:
//delete
//...
break;
default:
break;
}
}
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Thread t = new Server();
t.start();
}
}
Проблема
Я понимаю, что Mockito не может смоделировать конечные классы, такие как ObjectOutputStream и ObjectInputStream.
Это как раз то место, где я сталкиваюсь с проблемами.
Пока мой тест не проходит с NullPointerException в строке
when(server.fromClient.readObject()).thenReturn(0x2);
.
Этотипично для Mockito, при запуске в финальных методах.
ServerTest.class
@Test
void run() throws IOException, ClassNotFoundException {
//given
Other other = new Other(foo, bar);
Server server = mock(Server.class);
//when
when(server.fromClient.readObject()).thenReturn(0x2);
server.start();
//then
verify(server).toClient.writeObject(other.getSomething());
}
Что я пробовал
Было предложено в другие сообщения о том, что можно обойти final -проблему, изменив сигнатуру тестируемого класса, реализовав интерфейс ObjectInput
и, следовательно, посмеявшись над ним.
Однаков предлагаемом подходе неясно, как работать, если не передать ObjectOutputStream
в качестве аргумента тестируемому классу.
Кроме того, как работать, когда у вас есть ObjectInputStream
, непосредственно управляющий ответом ObjectOutputStream
как видно из моей case
структуры, которая не является нетипичной для клиентских / серверных приложений TCP.
Пока у меня сложилось впечатление, что мой тест будет работать, не будет ли он для последнего ключевого словав подписи ObjectOutputStream
,Поправьте меня здесь, если я ошибаюсь.
Q: "Почему я не передаю потоки на сервер?" A: Потому что они мне больше не нужны.
Это действительно последняя попытка сделать это, и я сделаю это, если мне придется, но я бы не стал.