
package com.tst.service;
import com.tst.repository.TestRepository;
import lombok.extern.log4j.Log4j2;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit.jupiter.SpringExtension;
@Log4j2
@ExtendWith(SpringExtension.class)
@SpringBootTest
public class TestServiceTest {
@Autowired
TestRepository testRepository;
@Test
void getTests() {
// Lombok이 생성해주는 'log' 객체 사용
log.info("테스트 데이터 조회: {}", entityDtoMapper.toTestDTOList(testRepository.findAll()));
}
}
안정적이고 효율적인 코드를 위해 Test 코드를 작성하려 하는데 2가지 문제가 생겼었다.
Test 환경에서 Log4j2 가 활성화 되지 않는 것 이다 ..
문제는 간단했다.
현재 Gradle 설정 상에서 Lombok 의존성은 main 소스에만 적용되고, test 소스에는 자동으로 적용되지 않는다. 그래서 테스트 컴파일 시 Lombok 어노테이션이 보이지 않아lombok.extern.log4j2.Log4j2 패키지를 찾을 수 없다는 오류가 발생 한 것이다.
// Lombok (테스트)
testCompileOnly 'org.projectlombok:lombok:1.18.24'
testAnnotationProcessor 'org.projectlombok:lombok:1.18.24'
테스트 환경용 의존성 코드를 추가해주면 해결이다.
문제 해결 후 테스트 메소드를 동작하니
%TESTC 1 v2
%TSTTREE2,com.tst.service.TestServiceTest,true,1,false,1,TestServiceTest,,[engine:junit-jupiter]/[class:com.tst.service.TestServiceTest]
%TSTTREE3,getTests(com.tst.service.TestServiceTest),false,1,false,2,getTests(),,[engine:junit-jupiter]/[class:com.tst.service.TestServiceTest]/[method:getTests()]
%TESTS 3,getTests(com.tst.service.TestServiceTest)
%TESTE 3,getTests(com.tst.service.TestServiceTest)
%RUNTIME4449

어라라
이는 Gradle이 JUnit Platform 테스트를 실행하면서 표준 출력(stdout), 표준 에러(stderr) 대신 Test Reporting Protocol(트리 구조 메시지)로 결과를 전달하고 있기 때문이다. 즉, 실제 테스트 메서드는 실행됐지만, 콘솔에 “log.info(…)” 같은 로그가 찍히지 않고 이 프로토콜 메시지만 보여주는 것..
표준 출력 로그를 보고싶다면 build.gradle에
tasks.named('test') {
useJUnitPlatform()
testLogging {
// 테스트가 성공해도 stdout/stderr를 보여주도록 설정
showStandardStreams = true
// 라이프사이클 이벤트(STARTED, PASSED, FAILED)도 함께 보여주려면
events "started", "passed", "skipped", "failed"
}
}
아래와 같은 코드를 입력해준다.

성공.