본문 바로가기
프로그래밍/EmbeddedChannel 이란?

EmbeddedChannel with JUnit - 2

by Flow.X 2022. 1. 10.
728x90

JUnit이라고 단위테스트용으로 쓰이는 모듈이 있다.

 

단위테스트 용 모듈 만들어놓고, 프로젝트 빌드 시 함수들 테스트 잘(?) 정의해놓고 함수에 대한 테스트를 자동으로 

수행함으로 혹시 있을지 모를 버그들을 사전에 체크할 수가 있지.

 

그래봐짜~ 잘 짜여진 테스트 코드를 만드는것도 쉽지도 않구.. 어려운 문제다 

 

JUnit을 써보자 ( with Visual Studio Code )

우선 vscode 사이트에 가보면 JUnit4, JUnit5, TestNG가 있는데

JUnit4를 써보자

 

아직 빌드툴을 통해 프로젝트를 생성 안했으니  Unmanaged Folder 부분을 보고 필요한 Jar를 찾자

https://code.visualstudio.com/docs/java/java-testing#_junit-4 

 

아래 폴더에 보면 junit.jar, hamcrest-core.jar라고 되어있으니

 

https://mvnrepository.com/ 에서 검색해보자 

 

vscode with JUnit

추가해보자

 

VS Code library추가 

EmbededExampleTest.java

테스트를 위한 코드이다.

 

Pipeline만 보면  들어와서 나가기까지의 과정이다 

LoggingHandler(byte) ▶ LineBasedFrameDecoder ▶ StringDecoder (String으로변환) ▶ EchoServerHandler(처리후 writeAndFluhs)

▶ StringEncoder(byte) ▶ LoggingHandler

 

코드상에서 main을 없애고 public void 형태의 함수를 추가하고  함수위에 @Test를 추가하면된다

import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.channel.embedded.EmbeddedChannel;
import io.netty.handler.codec.LineBasedFrameDecoder;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;
import io.netty.handler.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;
import io.netty.util.CharsetUtil;

public class EmbededExampleTest {
    public Logger logger = LoggerFactory.getLogger(EmbededExampleTest.class);

    @Test //이것만 달아주자 
    public void embed()  {

        EmbeddedChannel channel = new EmbeddedChannel(); //카페 차림 

        channel.pipeline().addLast(new LoggingHandler(LogLevel.INFO)); //들고 나가는 고객 로그 기록
        channel.pipeline().addLast(new LineBasedFrameDecoder(80)); // 엔터(\n)키로 단락 분리하고 80byte가 최대 임
        channel.pipeline().addLast(new StringDecoder(CharsetUtil.UTF_8)); // ByteBuf -> 문자열로 변경 
        channel.pipeline().addLast(new EchoServerHanlder()); // channelRead에 전달
        
        channel.pipeline().addLast(new StringEncoder(CharsetUtil.UTF_8)); // channelRead에 받은 String을 ByteBuf 로 변경 후 LoggingHandler로 전달 

        ByteBuf buf = Unpooled.buffer();
        buf.writeBytes("안녕 반가워\n".getBytes());
        
        channel.writeInbound(buf);  // 손님 들어간다
        ByteBuf readBuff = channel.readOutbound(); // 손님 나온다 

        logger.info("readBuff={}",((ByteBuf)readBuff).toString(CharsetUtil.UTF_8)); 
        channel.finish(); // 카페 닫는다
    }
}

class EchoServerHanlder extends ChannelInboundHandlerAdapter {
    final static Logger logger = LoggerFactory.getLogger(EmbededExampleTest.class);

    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        logger.info("channelActive..");
    }
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        logger.info("channelRead..{}", msg);
        ctx.channel().writeAndFlush(">> " + msg);
    }
    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        logger.info("channelInactive..");
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
    }
}

VS Code에서 JUnit 추가 후 실행

JUnit에서 initializationError 가 발생한다.

java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing 이다.

 

VS Code JUnit실행 오류 initializationError

hamcrest-core-${lastest.version}.jar 를 보니 hamcrest.jar로 옮겨졌다고 하네 

VS Code JUnit 오류

다시 다운받아서 수정후 돌려보자 .  Maven Repository로 이동해서

hamcrest-all 을 다운받아서 해당 jar를 추가하고 돌려보면 정상이다.

 

 

DEBUG CONSOLE에서 확인하자 

안녕 반가워\n 들어오고 (READ)  안녕반가워(WRITE)가 기록되었다  

728x90