programing

Junit에서 @AutoWired 주석과 함께 @InjectMocks를 사용하는 방법

yellowcard 2023. 9. 2. 08:09
반응형

Junit에서 @AutoWired 주석과 함께 @InjectMocks를 사용하는 방법

저는 3개의 다른 클래스를 오토와이어링으로 사용하는 클래스 A가 있습니다.

public class A () {

    @Autowired
    private B b;

    @Autowired
    private C c;

    @Autowired
    private D d;
}

테스트하는 동안 클래스(B & C) 중 2개만 모의로 하고 클래스 D를 정상적으로 자동 배선하고 싶은데 이 코드가 작동하지 않습니다.

@RunWith(MockitoJUnitRunner.class)
public class aTest () {

    @InjectMocks
    private A a;

    @Mock
    private B b;

    @Mock
    private C c;

    @Autowired
    private D d;
}

그렇게 하는 것이 가능할까요?

다음과 같은 것이어야 합니다.

@RunWith(SpringJUnit4ClassRunner.class)
public class aTest () {

    @Mock
    private B b;

    @Mock
    private C c;

    @Autowired
    @InjectMocks
    private A a;

}

네가 원한다면D되려고Autowired당신의 안에서 아무것도 할 필요가 없습니다.Test수업. 당신의Autowired A의 올바른 인스턴스가 있어야 합니다.D또한 당신은 사용할 필요가 있다고 생각합니다.SpringJUnit4ClassRunner위해서Autowiring작업할 때, 함께contextConfiguration정확하게 설정합니다.사용하지 않기 때문에MockitoJunitRunner초기화해야 합니다.mocks사용자 자신

Mockito Annotations.initMocks(java.lang).객체 테스트 클래스)

저는 같은 문제에 직면했고 사잔 찬드란의 답을 시도했습니다.제 경우에는 @SpringBoot를 사용하고 있기 때문에 작동하지 않았습니다.주석을 테스트하여 내 모든 콩의 하위 집합만 로드합니다.다른 의존성과 구성이 많기 때문에 제가 조롱하는 콩을 싣지 않는 것이 목표입니다.

그리고 저는 저에게 맞는 다음과 같은 다양한 솔루션을 찾았습니다. 일반적인 경우에도 사용할 수 있습니다.

@RunWith(SpringRunner.class)
@SpringBootTest(classes={...classesRequired...})
public class aTest () {

    @Mock
    private B b;

    @Mock
    private C c;

    @Autowired
    @Spy
    private D d;

    @InjectMocks
    private A a;

    @Before
    public void init(){
        MockitoAnnotations.initMocks(this);
    }

}

승인된 답변 외에도 스프링 부트를 사용하는 경우 @MockBean 주석(모의를 만들고 컨텍스트에 빈으로 추가하며 존재하는 경우 대체)을 사용하는 것이 더 쉽습니다.

@RunWith(SpringRunner.class)
public class aTest () {

    @MockBean
    private B b;

    @MockBean
    private C c;

    @Autowired
    private A a;
}

스프링 부트를 사용하지 않는 경우 @Autowired + @InjectMocks의 문제는 Spring이 먼저 콩 B와 C에 대해 불필요한 인스턴스를 로드한 다음 해당 인스턴스를 Mocks로 대체한다는 것입니다.이는 낭비이며 로드하지 않거나 로드할 수 없는 과도 종속성을 가질 수 있습니다.테스트를 위해 항상 최소 Spring 컨텍스트를 로드하는 것이 좋습니다.이를 권장합니다.

@RunWith(SpringRunner.class)
@Import({A.class, D.class})
@ContextConfiguration(classes = aTest.class)
public class aTest () {

    @Bean
    private B b() {
        return Mockito.mock(B.class);
    }

    @Bean
    private C c() {
        return Mockito.mock(C.class);
    }

    @Autowired
    private A a;
}

언급URL : https://stackoverflow.com/questions/34067956/how-to-use-injectmocks-along-with-autowired-annotation-in-junit

반응형