Toy Project/채팅 앱 만들기
[채팅앱][클라이언트] EventLoop 클래스 작성하기 - 반드시 단위 테스트 작성해야만 하는가에 대해서
johnna_endure
2020. 2. 27. 05:35
public class EventLoop extends Thread{
Selector selector;
EventHandler eventHandler = new EventHandler();
Logger logger = Logger.getLogger(EventLoop.class.getCanonicalName());
public EventLoop(Selector selector) {
this.selector = selector;
Thread.currentThread().setDaemon(true);
}
@Override
public void run() {
logger.entering("EventLoop", "run");
while(true) {
try {
selector.select();
logger.fine("[클라이언트][이벤트루프] : select() 호출됨.");
} catch (IOException e) {
e.printStackTrace();
}
Set<SelectionKey> selectionKeySet = selector.selectedKeys();
for (SelectionKey key : selectionKeySet) {
eventHandler.delegate(key);
}
}
}
}
생각보다 간단하다.
주입받은 selector 객체를 이용해 이벤트들을 Set 자료구조로 얻은 다음, 루프를 돌면서 이벤트 핸들러에 처리를 위임한다.
근데 저 클래스는 어떻게 테스트할 수 있을까?
난감하다.
애초에 클래스 설계에서부터 이 클래스는 반환값이 없는 부수효과를 기반으로 한 클래스다.
이벤트가 들어오면 이벤트를 핸들러로 위임하는게 역할의 전부인데, 위임하는 일 자체는 아무것도 반환하지 않는 부수효과다.
그리고 테스트한다면 뭘 테스트 해야하는걸까? 핸들러가 제대로 호출되는지 테스트해야되나? 그런데 호출의 여부는 코드에서 이미 명시적으로 나와있지 않나? 이는 코드가 제대로 기능을 하는지 여부와는 다른데, 이를테면 더 로우레벨의 이야기가 아닌가?
결론
단위 테스트로 이 클래스의 기능을 테스트하는 것은 의미가 없어보인다.
이 메서드가 관여하는 프로세스의 흐름을 측정해야 하는데, 이를 위해서는 일련의 '동작 테스트'가 필요해보인다.
내가 말한 '동작 테스트'는 여러 컴포넌트들을 조합해 여러 시나리오를 이용해 특정 결과를 내는지 알아보는 테스트다.