클래스에 주석을 달아 한정자가 있는 @MockBean을 생성하시겠습니까?
봄 부츠 테스트에서 저는 자격 조건이 다른 두 개의 모의 콩을 사용하고 있습니다.
@RunWith(SpringRunner.class)
@SpringBootTest
class HohoTest {
@MockBean @Qualifier("haha") IHaha ahaha;
@MockBean @Qualifier("hoho") IHaha ohoho;
}
나는 이 콩들을 명시적으로 사용하지 않기 때문에, 나는 차라리 그것들을 학급 본문에서 멀리 옮기고 싶습니다.@MockBean
이제 주석을 반복할 수 있습니다.
@RunWith(SpringRunner.class)
@SpringBootTest
@MockBean(IHaha.class)
@MockBean(IHaha.class)
class HohoTest {}
하지만 같은 타입이라 예선도 통과해야 합니다.제가 그것을 어떻게 달성할 수 있을지 생각해 보셨습니까?
왜냐하면 주석을 사용하기 때문입니다.@Qualifier
는 이름으로 빈을 선택하는 것을 의미하므로 다음과 같은 코드로 모의 이름을 설정할 수 있습니다.
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = {JsonMapperConfig.class})
public class IntegrationFlowTest {
@MockBean(name = "s3MessageRepository")
private S3Repository s3MessageRepository;
// etc
모의 정의를 테스트 클래스 밖으로 완전히 이동할 수 있는 경우 별도로 모의를 생성할 수도 있습니다.@Configuration
클래스:
@Configuration
public class MockConfiguration
{
@Bean @Qualifier("haha")
public IHaha ahaha() {
return Mockito.mock(IHaha.class);
}
@Bean @Qualifier("hoho")
public IHaha ohoho() {
return Mockito.mock(IHaha.class);
}
}
선언할 때@MockBean
클래스 수준에서는 현재 한정자를 제공할 수 없습니다.
이러한 지원을 받고 싶다면 Spring Boot 이슈 트래커에 요청하는 것이 좋습니다.
그렇지 않으면 계속해서 선언해야 합니다.@MockBean
옆의 들판에.@Qualifier
.
저는 @Order 주석으로 조롱당한 서비스 콩을 주입해야 하는 유사한 요구 사항이 있었습니다.서비스 기능의 호출 횟수도 확인해야 했습니다.다음은 저의 구현입니다.누군가에게 도움이 될 수도 있습니다.
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class ServiceNameTest {
@Autowired private ServiceName serviceName;
// Important: Used to reset interaction count of our static
// bean objects before every test.
@Before
public void reset_mockito_interactions() {
Mockito.clearInvocations(MockServicesConfig.bean1);
Mockito.clearInvocations(MockServicesConfig.bean2);
}
@Configuration
public static class MockServicesConfig {
public static InterfaceName bean1;
public static InterfaceName bean2;
@Bean
@Order(1)
public InterfaceName bean1() {
bean1 = Mockito.mock(InterfaceName.class);
// Common when() stubbing
return bean1;
}
@Bean
@Order(2)
public InterfaceName vmpAdapter() {
bean2 = Mockito.mock(InterfaceName.class);
// Common when() stubbing
return bean2;
}
}
@Test
public void test_functionName_mock_invocation1() {
// Arrange --> Act --> Assert
// nullify other functions custom when() stub.
// updating this functions custom when() stub.
verify(MockServicesConfig.bean1, times(1)).functionName("");
}
@Test
public void test_functionName_mock_invocation2() {
// Arrange --> Act --> Assert
// nullify other functions custom when() stub.
// updating this functions custom when() stub.
verify(MockServicesConfig.bean1, times(1)).functionName("");
}
}
이제 작동합니다.
@SpringBootTest(
classes = Some.class
)
@MockBean(name = BEAN_NAME, classes = TheBeanClass.class)
@MockBean(name = BEAN_NAME_2, classes = TheBeanClass.class)
class SomeTest {
private final Some some;
@Autowired
SomeTest(Some some) {
this.some = some;
}
}
예를 들어, 조롱된 콩을 사용해야 할 경우 생성자에 @Qualifier를 넣어야 합니다.
private final TheBeanClass theBeanclass;
private final Some some;
@Autowired
SomeTest(Some some, @Qualifier(BEAN_NAME) TheBeanClass theBeanClass) {
this.some = some;
this.theBeanClass = theBeanClass;
}
언급URL : https://stackoverflow.com/questions/54548461/create-mockbean-with-qualifier-by-annotating-class
'programing' 카테고리의 다른 글
문자열의 두 문자열 사이에 문자열 가져오기 (0) | 2023.08.09 |
---|---|
JFrame에서 전체 mariadb 출력을 가져올 수 없습니다. (0) | 2023.08.09 |
빠른 읽기 전용 외부, 읽기 쓰기 내부 속성 (0) | 2023.08.09 |
PHP - 배열 내부에서 배열을 병합하는 방법 (0) | 2023.08.09 |
여러 진입점을 갖도록 Spring Security 3.x 구성 (0) | 2023.08.09 |