테스트할 수 없는 테스트: 레거시 Java에서 정적 메서드를 처리하는 간단한 방법

테스트할 수 없는 테스트: 레거시 Java에서 정적 메서드를 처리하는 간단한 방법

저는 현재 10여년 전에 설계된 소프트웨어를 개발하고 있습니다. 플러그인 아키텍처를 제공합니다. 소프트웨어에서 수명주기를 처리하는 플러그인을 개발할 수 있습니다. 하지만 어려운 부분은 싱글톤의 정적 메서드를 통해 플랫폼 기능에 액세스하는 방법입니다.

@Override
public boolean start() {
    var aService = AService.getInstance();
    var anotherService = AnotherService.getInstance();
    // Do something with the services
    var result = ...;
    return result;
}

테스트하는 쉬운 방법은 없습니다. start() 방법. 예전에는 Mockito 개발자들이 이 기능을 반대했고 유일한 대안은 PowerMock이었습니다. 2020년 3.4.0 릴리스에서는 결정이 취소되어 Mockito에 정적 메서드 모의가 도입되었습니다.

나는 이전 상황이 더 좋았다. 내 생각에는 정적 메서드를 모의하는 것은 코드가 잘못 설계되었다는 신호입니다. 나는 이미 10년 전에 그것에 대해 썼습니다. PowerMock을 사용하면 정적 메서드를 모의하고, 테스트를 작성하고, 코드를 다시 디자인한 다음 PowerMock을 제거할 수 있습니다. 현재 상황에서는 디자인 냄새를 검색하기 위해 종속성을 볼 수 없습니다. 어쨌든 위의 문제는 여전히 남아 있고 디자인을 변경할 수 없습니다. 그것은 나에게 강요된 것입니다.

하지만 해결책은 이상할 정도로 간단합니다. 그 주위에 래퍼 메소드를 작성하세요.

@VisibleForTesting                                                 //1
boolean start(AService aService, AnotherService anotherService) {  //2
    // Do something with the services
    var result = ...;
    return result;
}

@Override
public boolean start() {
    var aService = AService.getInstance();
    var anotherService = AnotherService.getInstance();
    return start(aService, anotherService);                        //3
}
  1. 방법은 일반적으로 private하지만 테스트하고 싶기 때문에 패키지를 표시하도록 설정합니다. 그만큼 @VisibleForTesting 주석은 문서화 목적으로 사용됩니다.
  2. 테스트 가능한 메소드에는 조롱할 수 있는 매개변수가 있습니다.
  3. 테스트 가능한 메서드 호출

이 게시물에서는 종속성 주입을 기반으로 구축되지 않은 레거시 코드를 테스트하는 방법을 보여주었습니다. 이는 테스트할 수 없는 코드를 테스트하는 매우 간단한 방법입니다.


원래 2025년 10월 19일 A Java Geek에 게시되었습니다.

출처 참조

Post Comment

당신은 놓쳤을 수도 있습니다