모키토:개인 @Autowired 필드에 실제 개체 주입
나는 모키토의 것을 사용하고 있다.@Mock
그리고.@InjectMocks
Spring's로 주석을 단 개인 필드에 종속성을 주입하는 주석@Autowired
:
@RunWith(MockitoJUnitRunner.class)
public class DemoTest {
@Mock
private SomeService service;
@InjectMocks
private Demo demo;
/* ... */
}
그리고.
public class Demo {
@Autowired
private SomeService service;
/* ... */
}
이제 사적으로도 실물을 주입하고 싶습니다.@Autowired
필드(세터 없음)이것이 가능한가 아니면 Mocks만 주입하는 메커니즘인가?
사용하다@Spy
주석
@RunWith(MockitoJUnitRunner.class)
public class DemoTest {
@Spy
private SomeService service = new RealServiceImpl();
@InjectMocks
private Demo demo;
/* ... */
}
Mockito는 모든 분야를 검토한다.@Mock
또는@Spy
주석이 달린 인스턴스에 주입될 잠재적 후보로서의 주석@InjectMocks
주석입니다.위의 경우'RealServiceImpl'
인스턴스가 'instance'에 주입됩니다.
상세한 것에 대하여는, 을 참조해 주세요.
@Dev Blanked answer 외에 Spring에 의해 작성된 기존 bean을 사용하는 경우 코드를 다음과 같이 변경할 수 있습니다.
@RunWith(MockitoJUnitRunner.class)
public class DemoTest {
@Inject
private ApplicationContext ctx;
@Spy
private SomeService service;
@InjectMocks
private Demo demo;
@Before
public void setUp(){
service = ctx.getBean(SomeService.class);
}
/* ... */
}
이렇게 하면 테스트를 수행하기 위해 코드를 변경할 필요가 없습니다(다른 생성자 추가).
Mockito는 DI 프레임워크가 아니며 심지어 DI 프레임워크도 현장 주입보다 컨스트럭터 주입을 장려합니다.
따라서 컨스트럭터를 선언하고 테스트 대상 클래스의 종속성을 설정합니다.
@Mock
private SomeService serviceMock;
private Demo demo;
/* ... */
@BeforeEach
public void beforeEach(){
demo = new Demo(serviceMock);
}
모키토 사용spy
왜냐하면 일반적인 경우는 끔찍한 조언이기 때문이다.그것은 테스트 클래스를 불안정하게 만들고, 직선적이지 않고, 오류가 발생하기 쉽다: 정말 조롱받는 것은 무엇인가?실제로 테스트되는 것은 무엇입니까?
@InjectMocks
그리고.@Spy
비대해진 학급과 혼합된 책임감을 조장하기 때문에 전체적인 디자인도 해칩니다.
그것을 맹목적으로 사용하기 전에 javadoc을 읽어주세요(강조사항은 제 것이 아닙니다).
실제 객체의 스파이를 만듭니다.스파이는 스텁하지 않으면 진짜 방법을 부른다.실제 스파이는 레거시 코드를 다룰 때처럼 신중하게 그리고 가끔 사용해야 합니다.
여느 때처럼
partial mock warning
: 객체 지향 프로그래밍은 복잡성을 개별 SRPy 객체로 분할하여 복잡성에 대처합니다.부분 모의는 이 패러다임에 어떻게 들어맞을까요?음, 그건 그냥...일반적으로 부분 모의는 복잡도가 동일한 개체에서 다른 방법으로 이동되었음을 의미합니다.대부분의 경우 이 방법은 응용 프로그램을 설계하는 방법이 아닙니다.단, 코드(서드파티 인터페이스, 레거시 코드의 중간 리팩터링 등)를 쉽게 변경할 수 없는 경우가 있습니다.단, 테스트 주도로 설계된 새로운 코드에는 부분적인 모크를 사용하지 않습니다.
called called called called called called called called called called called called called called called라는 전용 .ReflectionTestUtils
이 목적을 위해.특정 인스턴스를 사용하여 필드에 주입합니다.
@Spy
..
@Mock
..
@InjectMock
Foo foo;
@BeforeEach
void _before(){
ReflectionTestUtils.setField(foo,"bar", new BarImpl());// `bar` is private field
}
오래된 질문인 것은 알지만 Strings를 주입하려고 할 때도 같은 문제에 직면했습니다.그래서 JUnit5/Mockito 확장기능을 개발했습니다.https://github.com/exabrial/mockito-object-injection
편집:
@InjectionMap
private Map<String, Object> injectionMap = new HashMap<>();
@BeforeEach
public void beforeEach() throws Exception {
injectionMap.put("securityEnabled", Boolean.TRUE);
}
@AfterEach
public void afterEach() throws Exception {
injectionMap.clear();
}
언급URL : https://stackoverflow.com/questions/20270391/mockito-inject-real-objects-into-private-autowired-fields
'sourcecode' 카테고리의 다른 글
콜이 완료될 때까지 vue 컴포넌트의 렌더링을 중지하려면 어떻게 해야 합니까? (0) | 2022.08.07 |
---|---|
Java를 사용하여 문자열을 텍스트파일에 저장하려면 어떻게 해야 하나요? (0) | 2022.08.07 |
Vuex 작업 페이로드가 정의되지 않았습니다. (0) | 2022.08.07 |
jwt 인증을 사용하여 vue 응용 프로그램에 자동 로그인 (0) | 2022.08.07 |
Nuxt JS vuex에서 Vue 라우터를 사용하여 리디렉션 (0) | 2022.08.07 |