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에 주입하는 것이 얼마나 쉬운 지 보여주었습니다.