>  기사  >  Java  >  JUnit에서 로그 메시지를 어설션하는 방법은 무엇입니까?

JUnit에서 로그 메시지를 어설션하는 방법은 무엇입니까?

DDD
DDD원래의
2024-10-30 07:38:02801검색

How to Assert on a Log Message in JUnit?

JUnit에서 로그 메시지를 확인하는 방법

소개:

외부와 통신하는 코드 동작 테스트 시스템에는 생성된 메시지의 내용과 형식을 확인하는 작업이 포함되는 경우가 많습니다. Java에서 로깅은 이러한 메시지를 기록하는 일반적인 방법입니다. 이 문서에서는 JUnit 프레임워크를 사용하여 로그 항목에 대해 단위 테스트를 수행하는 방법을 살펴봅니다.

로그 메시지에 대한 JUnit 어설션:

질문에 제공된 코드 조각은 다음을 주장하는 것을 목표로 합니다. 특정 수준(예: INFO) 및 메시지("x 발생")가 있는 특정 로그 항목이 테스트 중인 코드에 의해 생성되었습니다. 이를 달성하려면 로그 이벤트를 가로채서 저장하는 사용자 정의 로거 또는 핸들러를 사용할 수 있습니다.

사용자 정의 로거/핸들러 접근 방식:

이 접근 방식을 사용하려면 특수 로거를 생성해야 합니다. 또는 로깅 이벤트를 캡처하는 핸들러. 그러면 테스트 중인 코드의 로그 문이 이 사용자 정의 로거로 전달되어 기록된 메시지를 검색하고 검사할 수 있습니다. 그러나 이 접근 방식은 구현하기가 복잡할 수 있으며 테스트 중인 코드를 수정해야 합니다.

로그 수집기 패턴:

보다 편리한 솔루션은 다음과 같은 사용자 정의 어펜더를 사용하는 것입니다. 컬렉션이나 목록에 로깅 이벤트를 기록합니다. 이를 달성할 수 있는 방법은 다음과 같습니다.

  1. Appender 만들기:
    appender() 메서드를 재정의하여 로깅 이벤트를 데이터 구조에 저장하는 사용자 정의 Appender 하위 클래스를 구현합니다( 예: 목록).
  2. Logger에 Appender 추가:
    원하는 로거에 사용자 정의 Appender 인스턴스를 추가합니다. 이 단계는 테스트 메서드 내에서 수행하거나 @Before 및 @After와 같은 주석을 사용하여 수행할 수 있습니다.
  3. 메시지 어설션 로깅:
    테스트 중인 코드를 실행한 후 로그된 메시지 목록을 검색합니다. Appender의 이벤트. 그런 다음 제공된 코드 조각에 설명된 대로 JUnit의 어설션 메서드를 사용하여 로그 항목의 수준, 메시지 및 기타 속성을 확인할 수 있습니다.

샘플 구현:

다음 샘플 코드는 로그 수집기 패턴을 보여줍니다.

<code class="java">import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

import static org.junit.Assert.assertThat;
import static org.hamcrest.CoreMatchers.is;

public class LogCollectorTest {

    @Test
    public void testLogMessage() {
        // Create a custom appender to collect logging events.
        final TestAppender appender = new TestAppender();

        // Add the appender to the logger we wish to test.
        final Logger logger = Logger.getLogger(LogCollectorTest.class);
        logger.addAppender(appender);

        // Execute code under test.
        logger.info("Test");

        // Retrieve the list of logged events.
        final List<LoggingEvent> logs = appender.getLog();

        // Perform assertions on the first log entry.
        assertThat(logs.get(0).getLevel(), is(Level.INFO));
        assertThat(logs.get(0).getMessage(), is("Test"));
    }

    private static class TestAppender extends AppenderSkeleton {
        private final List<LoggingEvent> log = new ArrayList<>();

        @Override
        public boolean requiresLayout() {
            return false;
        }

        @Override
        protected void append(LoggingEvent loggingEvent) {
            log.add(loggingEvent);
        }

        @Override
        public void close() { }

        public List<LoggingEvent> getLog() {
            return new ArrayList<>(log);
        }
    }
}</code>

결론:

로그 수집기 패턴은 재사용 가능하고 편리한 어설션 방법을 제공합니다. JUnit 테스트의 로그 메시지. 기록된 이벤트를 데이터 구조로 캡처하면 해당 내용과 형식을 쉽게 확인하여 코드와 로깅 시스템의 상호 작용의 정확성을 보장할 수 있습니다.

위 내용은 JUnit에서 로그 메시지를 어설션하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.