복붙노트

[SPRING] Mockito @ InjectMocks는 어떻게 작동합니까?

SPRING

Mockito @ InjectMocks는 어떻게 작동합니까?

여기 내 질문 :

테스트 할 수있는 여러 웹 서비스 클래스가 있는데 모두 generic 서비스에서 메서드를 상속받습니다. 각각에 대해 단위 테스트를 작성하는 대신, 테스트 영역을 기능 영역 (즉, 서로 다른 기본 DAO 메소드 호출에 의존하는 세 가지 테스트 메소드 그룹)별로 구분할 수 있습니다.

내가 제안하는 것은 :

@Mock StateDAO mockedStateDao;
@Mock CountyDAO mockedCountyDao;
@Mock VisitorDAO mockedVisitorDao;

전화 :

@InjectMocks CountyServiceImpl<County> countyService = new CountyServiceImpl<County>();
@InjectMocks StateServiceImpl<State> stateService = new StateServiceImpl<State>();
@InjectMocks VisitorServiceImpl<Visitor> visitorService = new VisitorServiceImpl<Visitor>();

각 mockedDAO가 정확한 서비스에 주입 될 수 있는지 어떻게 확인할 수 있습니까? @InjectMocks를 사용하는 대신 3 가지를 모두 자동으로 호출하는 것이 더 쉬울까요?

저는 Spring, Hibernate, Mockito를 사용하고 있습니다 ...

해결법

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

    1.니콜라스 (Nikolas)의 대답은 거의 정확하지만 InjectMocks의 javadoc을 추측하는 대신 더 자세한 내용을 포함하고 있습니다.)

    니콜라스 (Nikolas)의 대답은 거의 정확하지만 InjectMocks의 javadoc을 추측하는 대신 더 자세한 내용을 포함하고 있습니다.)

    나에게 하나의 테스트에서 너무나 많은 서비스를받는 것은 이상한 일이며, 단위 테스트 또는 통합 테스트로서 적절하지 않다고 생각합니다. 단위 테스트에서는 너무 많은 공동 작업자가 있기 때문에 객체 지향 (또는 SOLID)처럼 보이지 않으므로 잘못되었습니다. 통합 테스트에서 DB와의 통합을 테스트하는 코드가 모의하지 않기 때문에 이상합니다.

    1.9.5의 빠른 참조를 얻으려면 다음과 같이하십시오.

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

    2.여러 서비스가 있고 Spring 기반 환경에서 DAO를 모의 객체로 바꾸려면 Springockito를 사용하는 것이 좋습니다. https://bitbucket.org/kubek2k/springockito/wiki/Home

    여러 서비스가 있고 Spring 기반 환경에서 DAO를 모의 객체로 바꾸려면 Springockito를 사용하는 것이 좋습니다. https://bitbucket.org/kubek2k/springockito/wiki/Home

    또한 여기에 언급되어 있습니다 : 봄 콩에 모키 토 모의 주입

    Testclass는 다음과 같이 보일 것이다.

    @RunWith (SpringJUnit4ClassRunner.class)
    @ContextConfiguration (loader = SpringockitoContextLoader.class, locations =    {"classpath:/org/example/package/applicationContext.xml"})
    public class NameOfClassTest {
    
        @Autowired
        @ReplaceWithMock 
        StateDAO mockedStateDao;
    
        @Autowired
        @ReplaceWithMock 
        CountyDAO mockedCountyDao;
    
        @Autowired
        @ReplaceWithMock 
        VisitorDAO mockedVisitorDao;
    

    @Test 또는 @Before Methode에서 표준 Mockito 방법으로 mock을 설정할 수 있습니다.

    Mockito.doReturn(null).when(mockedCountyDao).selectFromDB();
    
  3. ==============================

    3.static 메소드 MockitoAnnotations.initMocks (Object)는 전체 프로세스를 부트 스트랩하는 데 사용됩니다.

    static 메소드 MockitoAnnotations.initMocks (Object)는 전체 프로세스를 부트 스트랩하는 데 사용됩니다.

    소스 코드를 탐색하지 않았으므로 어떻게 작동하는지 모르겠지만 다음과 같이 구현할 것입니다.

  4. ==============================

    4.Nevermind는 온라인에서 보았습니다. InjectMocks 주석은 @Mock 주석이있는 항목을 필드로 취급하고 정적 범위 (클래스 전체)이므로 모의 객체가 올바른 서비스로 이동한다는 사실을 알 수 없었습니다. 이것은 클래스 레벨이 아닌 피쳐 레벨에서 단위 테스트를 시도하기위한 약간의 생각 실험이었습니다. 봄에 이걸 자동으로 풀어 주겠다.

    Nevermind는 온라인에서 보았습니다. InjectMocks 주석은 @Mock 주석이있는 항목을 필드로 취급하고 정적 범위 (클래스 전체)이므로 모의 객체가 올바른 서비스로 이동한다는 사실을 알 수 없었습니다. 이것은 클래스 레벨이 아닌 피쳐 레벨에서 단위 테스트를 시도하기위한 약간의 생각 실험이었습니다. 봄에 이걸 자동으로 풀어 주겠다.

  5. from https://stackoverflow.com/questions/15228777/how-does-mockito-injectmocks-work by cc-by-sa and MIT license