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/ 에서 검색해보자
추가해보자
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 이다.
hamcrest-core-${lastest.version}.jar 를 보니 hamcrest.jar로 옮겨졌다고 하네
다시 다운받아서 수정후 돌려보자 . Maven Repository로 이동해서
hamcrest-all 을 다운받아서 해당 jar를 추가하고 돌려보면 정상이다.
DEBUG CONSOLE에서 확인하자
안녕 반가워\n 들어오고 (READ) 안녕반가워(WRITE)가 기록되었다
'프로그래밍 > EmbeddedChannel 이란?' 카테고리의 다른 글
EmbeddedChannel 활용 (LineBasedFrameDecoder 테스트) (0) | 2022.01.10 |
---|---|
01. Pipeline 테스트 간단히 하기(feat. EmbeddedChannel) - 1 (0) | 2022.01.07 |