sourcecode

모키토:개인 @Autowired 필드에 실제 개체 주입

copyscript 2022. 8. 7. 16:47
반응형

모키토:개인 @Autowired 필드에 실제 개체 주입

나는 모키토의 것을 사용하고 있다.@Mock그리고.@InjectMocksSpring'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'에 주입됩니다.

상세한 것에 대하여는, 을 참조해 주세요.

모키토홈

@스파이

@Mock

@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

반응형