2013-05-15 2 views
17

안녕하세요 저는 jsf 애플리케이션 및 모의 객체에 대한 몇 가지 테스트를 구현하려고합니다. mockito를 사용하고 있습니다. 나는 getInstance 방법으로 인스턴스를 검색하고자 할 때Mockito 모의 객체가 null을 반환합니다.

@RunWith(MockitoJUnitRunner.class) 
public class GeneralConfigServiceImplTest { 

    private GeneralConfigService generalConfigService; 

    @Mock 
    private GeneralConfigDAO generalConfigDAO; 

    @Mock 
    private GeneralConfig gen; 

    @Before 
    public void setUp() { 
     MockitoAnnotations.initMocks(this); 
     generalConfigService = new GeneralConfigService(); 
     ReflectionTestUtils.setField(generalConfigService, "generalConfigDAO", generalConfigDAO);     
    } 

    @Test 
    public void testAddGeneralConfigCallDAOSuccess() throws DAOException, EntityNullException, IllegalEntityArgumentException, ParseException, EntityPersistException { 
     gen = createGeneralConfigs("label", "value"); 

     generalConfigService.setInstance(gen); 
     generalConfigService.persist(); 
     log.info(generalConfigService.getInstance().toString()); 
    } 
} 

시험에 성공 (나는 또한 스프링 사용), 그러나. 이전에 생성자를 통해 설정 한 모든 매개 변수는 null입니다. 나는 조롱 한 객체에 익숙하지 않으므로 정상적인 동작입니까, 아니면 내 코드에 실수가 있습니까?

+0

문제의 물체를 조롱하지 않으므로 조롱과 관련이없는 것 같습니다. –

답변

14

정말 GeneralConfigService # getInstance() 구현에 따라 다릅니다. 또한 @InjectMocks 주석을 사용하면 테스트 코드를 단순화 할 수 있습니다.

수동으로 종속성을 모의 객체를 초기화하고 주입 할 필요가 없습니다 MockitoJUnitRunner를 사용하여 : Mockito 모의 객체는 기본적으로 null을 반환에

@RunWith(MockitoJUnitRunner.class) 
public class GeneralConfigServiceImplTest { 

    @InjectMocks 
    private GeneralConfigService generalConfigService; 

    @Mock 
    private GeneralConfigDAO generalConfigDAO; 

    @Test 
    public void testAddGeneralConfigCallDAOSuccess() { 
     // generalConfigService is already instantiated and populated with dependencies here 
     ... 
    } 
} 
+0

그냥 여기에두고 : https://tedvinke.wordpress.com/2014/02/13/mockito-why-you-should-not-use-injectmocks-annotation-to-autowire-fields/ –

3

모든 방법을 호출합니다. 다른 것을 돌려주고 싶다면 when 문을 사용하여 지시해야합니다. 그것은 당신이 다음이 작동 할 것이라고 생각하는 것 같다

... 당신은 setInstance를 호출 한 다음이가 DAO가 어떻게 작동하는지 때문에 setInstance에 전달 된 값을 반환 getInstance를 기대합니다. 이것이 시도하고있는 것이라면 getInstance을 호출하여 setInstance을 테스트하면 안됩니다. getInstance은 모의 결과를 반환하도록 구성했기 때문에 setInstance에 전달 된 것과 관련이 없으므로 반환하지 않습니다. 대신 verify을 사용하여 DAO의 적절한 메서드가 setInstance 메서드에서 호출되었는지 확인하십시오. gen가 왜 gen = createGeneralConfigs...

를 통해 다른 무언가에 할당된다 ( @Mock를 통해) 모의 경우 예를 들어

, GeneralConfigService.setInstance 전화 GeneralConfigDAO.setInstance 다음 테스트는 다음과 같아야합니다 경우 ... 또한

@Test 
public void testAddGeneralConfigCallDAOSuccess() throws DAOException, EntityNullException, IllegalEntityArgumentException, ParseException, EntityPersistException { 
gen = createGeneralConfigs("label", "value"); 

generalConfigService.setInstance(gen); 
generalConfigService.persist(); 

verify(genConfigDAO).setInstance(sameInstance(gen)); 
} 

,

6

는 OBJE 비웃음하는 경우

MockitoAnnotations.initMocks(this); 

를 사용하는 것을 잊지 마세요 ct through annotation 즉, @Mock Objectname

+1

initMocks는 필요하지 않습니다. Mockito JUnit 러너를 사용합니다. –

+0

의견을 주셔서 감사합니다. 어쨌든 나는 믿는다 ... –

+0

오늘 나는 주류에서 모의 ​​것을 사용하고있다. 네 ~ – Tiina

관련 문제