programing

@MockBeans 예제 사용

instargram 2023. 7. 26. 21:34
반응형

@MockBeans 예제 사용

여러 서비스를 사용하는 컨트롤러 클래스가 있습니다.저는 다음과 같은 컨트롤러에 대한 테스트를 작성합니다.

@RunWith(SpringRunner.class)
@WebMvcTest(value = PurchaseController.class, secure = false)
public class PurchaseControllerTest {

    @MockBean
    private ShoppingService shoppingService;

    @MockBean
    private ShopRepository shopRepository;

    @MockBean
    private SomeOtherRepository someOtherRepository;

    @Autowired
    private MockMvc mockMvc;

// ... some tests goes here

문제는, 많은 가짜들이 있다는 것입니다. 코드 줄이 그렇게 많다는 것입니다.이게 코드 냄새의 징후일 수도 있다는 건 알지만, 지금은 그게 요점이 아닙니다.

나는 또한 그것이 있다는 것을 알아차렸습니다.@MockBeans가 있는 주석@Target(ElementType.TYPE)그래서 시도해 볼 수 있을 것 같았어요.

@RunWith(SpringRunner.class)
@WebMvcTest(value = PurchaseController.class, secure = false)
@MockBeans(value = {ShoppingService.class, ShopRepository.class})
public class PurchaseControllerTest {

하지만 컴파일은 하지 않습니다.

제 질문은: 어떻게 우리가@MockBeans주석?제 경우에도 적용이 되나요?

@MockBeans그것은 단지 곱셈에 대한 반복 가능한 주석일 뿐입니다.@MockBean이 조롱된 빈을 재사용해야 할 경우 클래스/구성 클래스에 넣을 수 있습니다.하지만 당신은 사용해야 합니다.@Autowired당신이 조롱해야 할 서비스를 위해. 그래서 당신의 경우에는 다음과 같아야 합니다.

.....
@MockBeans({@MockBean(ShoppingService.class), @MockBean(ShopRepository.class)})
public class PurchaseControllerTest {
  @Autowired
  ShoppingService shoppingService;
  @Autowired
  ShopRepository shopRepository;
.....
}

의 주요 아이디어@MockBeans반복되는 것뿐입니다.@MockBean한자리에나에게 있어서는 재사용할 수 있는 일부 구성/공통 클래스에만 유용할 수 있습니다.

@MockBean모의실험을 만듭니다.@Autowired컨텍스트에서 자동 배선된 빈입니다. 사용자의 경우 빈을 조롱된 것으로 표시/생성한 다음 조롱된 빈이 자동 배선된 필드에 주입됩니다.

따라서 자동 배선된 필드가 많은 경우@MockBeans(또는 곱셈)@MockBean모의인지 아닌지를 한 곳에서 구성할 수 있습니다.@MockBeans수업 수준을 위해) 그리고 당신은 변화가 필요하지 않습니다.@Autowired로.@Mock당신의 시험 수업에서 (당신의 경우처럼 당신이 제거할 수 있습니다.@MockBeans조롱당하지 않는 모든 자동 배선된 콩은 컨텍스트에서 콩으로 자동 배선되며, 제거를 취소하면 조롱당한 콩에서 작업하게 됩니다(이 주석 내부에서 구성한).

한 클래스 내에서 많은 종속성을 방지하려면 모든 종속성을 일부 상위 클래스로 추출할 수 있지만 Java가 클래스에 대한 다중 상속을 지원하지 않기 때문에 항상 도움이 되는 것은 아닙니다.

당신의 경우에 가장 짧은 변형은@MockBean필요한 모크 클래스의 여러 값을 지원합니다.

@MockBean({ShoppingService.class, ShopRepository.class})

자바독은 그것이 다음과 같이 사용된다고 말합니다.

여러 {@link MockBean}개의 주석을 집계하는 컨테이너 주석입니다.

그래서 당신은 쓸 수 있습니다.

@MockBeans({@MockBean(ShoppingService.class), @MockBean(ShopRepository.class)})
public class PurchaseControllerTest {

@Autowire ShoppingService여기서 작동합니다.

또는

반복 가능한 주석에 대한 Java 8의 지원과 함께 사용할 수도 있습니다.

@MockBean(ShoppingService.class)
@MockBean(ShopRepository.class)
public class PurchaseControllerTest {

Java 8은 반복 가능한 주석을 사용할 수 있으며 호환성을 위해 반복 주석이 컨테이너 주석에 저장됩니다.@MockBeansJava 컴파일러에 의해 자동으로 생성됩니다.컴파일러가 이를 수행하려면 다음 두 가지가 필요합니다.

  • 가능한 복반능가@Repeatable(MockBeans.class) 유형 석주형@MockBean
  • 유형 포함 석유 형함포@MockBeans

언급URL : https://stackoverflow.com/questions/56132357/mockbeans-example-use

반응형