복붙노트

[SPRING] Junit에서 @Autowired 주석과 함께 @InjectMocks를 사용하는 방법

SPRING

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

autowiring과 함께 3 가지 클래스를 사용하는 클래스 A가 있습니다.

public class A () {

    @Autowired
    private B b;

    @Autowired
    private C c;

    @Autowired
    private D d;
}

그 (것)들을 테스트하고있는 동안, 나는 단지 2 개의 종류 (B & C)를 가짜로 삼고 싶고 클래스 D를 Autowire로 정상적으로 실행하고 싶습니다.이 코드는 저를 위해 작동하지 않습니다 :

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

    @InjectMocks
    private A a;

    @Mock
    private B b;

    @Mock
    private C c;

    @Autowired
    private D d;
}

그렇게 할 수 있습니까?

해결법

  1. ==============================

    1.그것은 뭔가와 같아야합니다.

    그것은 뭔가와 같아야합니다.

    @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의 정확한 인스턴스를 가져야합니다. 또한 contextConfiguration이 올바르게 설정된 상태에서 Autowiring을 위해 SpringJUnit4ClassRunner를 사용해야한다고 생각합니다. 당신이 MockitoJunitRunner를 사용하지 않기 때문에 당신은 당신 자신의 모의 객체를 스스로 초기화해야합니다.

  2. ==============================

    2.나는 같은 문제에 직면했고 Sajan Chandran의 대답을 시도했다. 내 모든 콩의 하위 집합 만로드하기 위해 @SpringBootTest 주석을 사용하고 있기 때문에 제 경우에는 작동하지 않았습니다. 목표는 다른 종속성과 구성이 많기 때문에 조롱하는 콩을로드하지 않는 것입니다.

    나는 같은 문제에 직면했고 Sajan Chandran의 대답을 시도했다. 내 모든 콩의 하위 집합 만로드하기 위해 @SpringBootTest 주석을 사용하고 있기 때문에 제 경우에는 작동하지 않았습니다. 목표는 다른 종속성과 구성이 많기 때문에 조롱하는 콩을로드하지 않는 것입니다.

    그리고 나는 정상적인 경우에도 사용할 수있는 다음 변형 된 솔루션을 찾았습니다.

    @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);
        }
    
    }
    
  3. from https://stackoverflow.com/questions/34067956/how-to-use-injectmocks-along-with-autowired-annotation-in-junit by cc-by-sa and MIT license