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
'programing' 카테고리의 다른 글
MySQL 하위 문자열 빈 값 반환 (0) | 2023.09.02 |
---|---|
Express res.send 파일 던지기 금지 오류 (0) | 2023.09.02 |
.NetCore MariaDb Dapper - 저장 프로시저를 실행하는 방법? (0) | 2023.09.02 |
PHP/HTML 혼합 코드를 올바르게 들여쓰는 방법은 무엇입니까? (0) | 2023.08.28 |
Gitrebase 병합 충돌 (0) | 2023.08.28 |