1. 개요

이 기사에서는 의존성 주입을 사용하여 단위 테스트를 위해 Mockito 모의를 Spring Beans에 삽입하는 방법을 보여줍니다.

구성 요소가 종종 외부 시스템에 액세스하는 데 의존하는 실제 응용 프로그램에서는 적절한 테스트 격리를 제공하여 각 테스트에 대한 전체 클래스 계층 구조를 포함하지 않고도 주어진 단위의 기능을 테스트하는 데 집중할 수 있도록하는 것이 중요합니다.

모의를 주입하는 것은 그러한 격리를 도입하는 깨끗한 방법입니다.

2. Maven 의존성

단위 테스트 및 모의 객체에 대해 다음 Maven 의존성이 필요합니다.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <version>2.4.0</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <version>2.4.0</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>2.21.0</version>
</dependency>

이 예제에서는 Spring Boot를 사용하기로 결정했지만 클래식 Spring도 잘 작동합니다.

3. 테스트 작성

3.1. 비즈니스 로직

먼저 테스트 할 간단한 서비스를 만들어 보겠습니다.

@Service
public class NameService {
    public String getUserName(String id) {
        return "Real user name";
    }
}

그리고이를 UserService 클래스에 삽입합니다 .

@Service
public class UserService {

    private NameService nameService;

    @Autowired
    public UserService(NameService nameService) {
        this.nameService = nameService;
    }

    public String getUserName(String id) {
        return nameService.getUserName(id);
    }
}

이 자습서에서는 제공된 ID에 관계없이 지정된 클래스가 단일 이름을 반환합니다. 이것은 복잡한 논리를 테스트하여주의가 산만 해지지 않도록 수행됩니다.

빈을 스캔하고 애플리케이션을 초기화하기 위해 표준 Spring Boot 메인 클래스도 필요합니다.

@SpringBootApplication
public class MocksApplication {
    public static void main(String[] args) {
        SpringApplication.run(MocksApplication.class, args);
    }
}

3.2. 테스트

이제 테스트 로직으로 이동해 보겠습니다. 먼저 테스트를 위해 애플리케이션 컨텍스트를 구성해야합니다.

@Profile("test")
@Configuration
public class NameServiceTestConfiguration {
    @Bean
    @Primary
    public NameService nameService() {
        return Mockito.mock(NameService.class);
    }
}

@profile 어노테이션은 "테스트"프로필이 활성화 된 경우에만 Spring이 구성을 적용 알려줍니다. @primary 어노테이션은 확인이 인스턴스에서 autowiring을위한 진짜 대신 사용하기 위해 존재한다. 메서드 자체는 NameService 클래스 의 Mockito 모의를 생성하고 반환합니다 .

이제 단위 테스트를 작성할 수 있습니다.

@ActiveProfiles("test")
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = MocksApplication.class)
public class UserServiceUnitTest {

    @Autowired
    private UserService userService;

    @Autowired
    private NameService nameService;

    @Test
    public void whenUserIdIsProvided_thenRetrievedNameIsCorrect() {
        Mockito.when(nameService.getUserName("SomeId")).thenReturn("Mock user name");
        String testName = userService.getUserName("SomeId");
        Assert.assertEquals("Mock user name", testName);
    }
}

우리는 사용 @ActiveProfiles의 "테스트"프로필을 사용하려면 어노테이션을 우리가 이전에 쓴 모의 구성을 활성화합니다. 이 때문에 Spring은 UserService 클래스 의 실제 인스턴스를 자동 연결 하지만 NameService 클래스 의 모의를 자동 연결합니다 . 테스트 자체는 상당히 일반적인 JUnit + Mockito 테스트입니다. 모의 객체의 원하는 동작을 구성한 다음 테스트하려는 메서드를 호출하고 예상 한 값을 반환한다고 주장합니다.

이러한 테스트에서 환경 프로필을 사용하지 않는 것도 가능합니다 (권장되지는 않음). 이렇게하려면 @Profile 및 @ActiveProfiles 어노테이션을 제거하고 @ContextConfiguration (classes = NameServiceTestConfiguration.class) 어노테이션을 UserServiceTest 클래스에 추가합니다.

4. 결론

이 빠른 튜토리얼에서는 Mockito 모의를 Spring Beans에 주입하는 것이 얼마나 쉬운 지 보여주었습니다.

평소처럼 모든 코드 샘플은 GitHub에서 사용할 수 있습니다 .