상식닷컴
로그인
가입하기
2026년 상식닷컴 선정 식당 & 카페 리스트
2025년 2026년 신상 호텔 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요
일주일 식단표 어플
자동 일주일 식단표 어플
안드로이드
아이폰
주식 & 코인 차트의 신
1000만원으로 2000만원 만들기 프로젝트
궁금한 상식 보기
Flutter에서 카메라 기능을 사용하는 방법은 무엇인가요?
Flutter에서 애니메이션 컨트롤러란 무엇인가요?
다트에서 외부 라이브러리를 사용하는 방법은?
KB국민은행의 외환 거래 시 필요한 서류는?
카이로 회담에서의 주요 논의가 후속 회담에 미친 영향은 무엇인가요?
나폴레옹의 몰락 원인은 무엇인가요?
나폴레옹의 개인적인 성격은 어땠나요?
하노이의 대중교통은 어떻게 이용하나요?
하노이의 주요 음식 문화는 어떤 특징이 있나요?
하노이의 주요 문화재는 무엇이 있나요?
하노이의 교통수단은 어떤 것이 있나요?
신칸센의 기차에서 Wi-Fi는 제공되나요?
Previous
Next
수정하기 - Robolectric을 사용하여 로그 기록을 테스트하는 방법은 무엇인가요?
닉네임
비밀번호
제목
내용
[이미지 업로드는 권한이 있는 사람만 가능. 하단 카톡으로 연락]
Robolectric으로 안드로이드 로그(Logcat)에 출력되는 로그 메시지를 테스트하려면 기본적으로 `android.util.Log` 클래스의 출력을 캡처하거나 모킹(mocking)하는 방법을 사용해야 합니다. 왜냐하면 Robolectric은 JVM 환경에서 실행되므로 실제 안드로이드 로그 시스템에 접근할 수 없고, 따라서 로그 출력이 어떻게 이루어졌는지 직접 확인하려면 약간의 우회가 필요합니다. 다음은 Robolectric으로 로그 기록을 테스트하는 데 활용할 수 있는 몇 가지 방법을 자세히 설명합니다. --- 1. `ShadowLog` 사용하기 Robolectric은 `Shadow` 클래스를 통해 안드로이드 프레임워크 클래스를 흉내내고 기능을 확장하는데, `ShadowLog`라는 클래스가 로그 출력을 모킹할 수 있도록 지원합니다. - 설정 : `build.gradle` 또는 테스트 코드에서 Robolectric 4.0 이상이 포함되어 있어야 합니다. - 동작 원리 : `ShadowLog`는 `android.util.Log`의 호출을 가로채 로그 출력을 내부 리스트에 저장합니다. - 예시 코드 : ```java import android.util.Log; import org.junit.Before; import org.junit.Test; import org.robolectric.shadows.ShadowLog; import static org.junit.Assert.*; public class MyLoggerTest { @Before public void setUp() { ShadowLog.clear(); // 이전 로그 초기화 } @Test public void testLogOutput() { // 로그 작성 Log.d("MyTag", "Debug message"); Log.e("MyTag", "Error message"); // ShadowLog의 모의 로그 출력 리스트 확인 boolean foundDebug = false; boolean foundError = false; for (ShadowLog.LogItem logItem : ShadowLog.getLogs()) { if (logItem.tag.equals("MyTag") && logItem.msg.equals("Debug message") && logItem.type == Log.DEBUG) { foundDebug = true; } if (logItem.tag.equals("MyTag") && logItem.msg.equals("Error message") && logItem.type == Log.ERROR) { foundError = true; } } assertTrue("Debug log is recorded", foundDebug); assertTrue("Error log is recorded", foundError); } } ``` - 포인트 : - `ShadowLog.getLogs()`를 호출하면 모든 로그 이벤트를 `List<ShadowLog.LogItem>`으로 리턴합니다. - 각 `LogItem`은 `tag`, `msg`, `type`(log level) 필드를 가집니다. - 테스트 전에 꼭 `ShadowLog.clear()`로 초기화해야 이전 로그와 섞이지 않습니다. --- 2. Log 메서드 모킹(Mock)하기 (Mockito 활용) `android.util.Log`는 의존성이 없이 직접 호출될 때는 모킹이 불편하지만, 만약 로그 출력을 한곳에서 래핑(wrapping)했다면 해당 래퍼 메서드를 Mockito 등으로 모킹하여 호출 여부를 확인할 수도 있습니다. 예) ```java public class MyLogger { public void logDebug(String message) { Log.d("MyTag", message); } } ``` 이 경우 `MyLogger`의 메서드를 테스트하고 싶으면 실제 `Log.d`가 호출됐는지 직접 확인하기 어렵기에 다음과 같이 래퍼 인터페이스를 만들고, 테스트 시 모킹하는 방식을 쓸 수 있습니다. --- 3. 로그 출력을 래핑하는 인터페이스 설계 및 주입 로깅을 위해 별도의 인터페이스(예: `ILogger`)를 만들고, 실제 앱에서는 `AndroidLogger` 구현체를 제공하며, 테스트 시 모킹 객체를 주입하는 방법입니다. 이 방식은 의존성 주입(Dependency Injection, DI)을 활용하는 형태로, 다음과 같이 이점이 있습니다. - 로그 출력 여부뿐 아니라 로그 메시지 내용도 쉽게 테스트 가능 - 로그 구현체를 바꿔 사용 가능 - Robolectric 테스트는 `Log` 사용과 무관하게 독립성 확보 --- 종합 요약 - 가장 간단한 방법 은 Robolectric의 `ShadowLog`를 이용하는 것 - Robolectric 환경에서는 실제 Logcat 출력이 안되므로 `ShadowLog.getLogs()`로 로그 메시지를 수집해서 확인 가능 - 테스트 전에 `ShadowLog.clear()`를 꼭 호출하여 이전 상태를 초기화 - 로그 출력을 한 곳에서 모듈화 했다면 Mockito 등의 모킹 프레임워크로 로그 호출을 검증하는 방법도 있음 - 규모가 큰 프로젝트라면 로그 래퍼 인터페이스를 만들어 테스트 용이성과 유지보수를 개선하는 것이 좋음 --- 참고 문서 및 링크 - [Robolectric Shadows: ShadowLog class](http://robolectric.org/javadoc/4.7/org/robolectric/shadows/ShadowLog.html) - Stack Overflow 관련 질문: "[How to test a Log statement using Robolectric?](https://stackoverflow.com/questions/24218853/how-to-test-a-log-statement-using-robolectric)" - Mockito 공식 문서 --- 이와 같이 Robolectric 테스트에서 로그를 검증할 때는 Robolectric이 제공하는 ShadowLog를 적극 활용하거나, 설계 단계에서 로그 출력을 래핑 및 주입 가능한 구조로 만드는 것이 실용적입니다.
이용안내
커뮤니티 이용안내
×
- 게시한 게시글로 발생하는 문제는 게시자에게 책임이 있습니다.
- 게시글이 타인/타업체의 저작권을 침해할 경우 모든 책임은 게시자에게 있습니다. 게시자가 모든 손해를 부담해야 합니다.
- 상식닷컴 운영자는 게시자와 상의하지 않고 게시글을 수정 또는 삭제할 수 있습니다.
- 상식닷컴 운영자는 깨끗한 커뮤니티 공간을 만드는 것이 1순위입니다.
수정하기
취소하기