2013-05-26 3 views
0

나는 Mockito 1.9.5를 사용하여 메서드를 시도하고 테스트합니다. 나는 그것을 테스트하기 위해 노력하고 방법반환 값을 조롱

@Autowire 
AuditLogRepository auditlogRepository; 

//method stuff abbreviated out 

if (authentic.isAuthorized()) { 
    menuService.updateUserWithMenu(authentic); 
    AuditLog auditor = Helper.buildAuditor(authentic); 
    auditor.setAccessPoint(request.getRequestURL().toString()); 
    .... 
    AuditLog createdAuditLog = auditlogRepository.save(auditor); 
    logger.debug("Created AuditLog id = " + createdAuditLog.getID()); 
    ... 

} 

그리고 여기에 있습니다 : : 여기에 방법이다

그것은 내가 상관없이 보이는
@InjectMocks 
LoginController loginController; 

@Mock 
AuditLog aLog; 

@Mock 
AuditLog createdAuditLog; 

@Mock 
AuditLogRepository auditlogRepositoryMock; 

@Before 
public void setUp() { 
    MockitoAnnotations.initMocks(this); 
    this.mockMvc = MockMvcBuilders.standaloneSetup(loginController).build(); 
} 

@Test  
public void testLogin() throws Exception { 
    ... 
    AuditLog aLog = mock(AuditLog.class); 
    when(auditlogRepositoryMock.save(aLog)).thenReturn(createdAuditLog); 
    when(createdAuditLog.getID()).thenReturn(new Long(1)); 

는 Mockito은 항상 기본 요소를 제외하고, null를 돌려줍니다. 하지만 내 코드는 반환 값에 따라 작동 할 것입니다. 그래서 내 질문에 null 포인터를 얻지 않고 이것을 테스트하는 방법은 무엇입니까? Mockito는 메서드 호출에서 객체를 반환 할 수 있습니까?

+4

저는 Mockito (약 4 개월 만 사용하고 있습니다)에 익숙해 져 있으므로 답변 대신 댓글을 게시하겠습니다. 나는 당신이 객체 ('aLog')로'save()'를 호출 할 때만'createdAuditLog'를 반환한다고 말하는 것 같습니다. 나는 Matcher 클래스를 사용하여 when/thenReturns를 설정하고있다. 이 때처럼 (auditlogRepositoryMock.save (Matchers.any (AuditLog.class)) .Return (createdAuditLog); ' – Kyle

+0

예, mockito가 객체를 반환 할 수 있습니다. nullpointer에 대한 자세한 정보를 제공 할 수 있습니까? – Vegard

+0

@Kyle of my view 귀하의 의견을 맞습니다. 메서드는 저장 aLog 인스턴스를 사용하여 호출되지 않은 경우 반환되지 않습니다 및 mockito 그의 기본 동작을 사용합니다. 완전한 코드없이 이것은 최고의 대답입니다. 그래서 답변으로 게시;). – mszalbach

답변

0

당신은 필드 테스트의 지역 변수 모두 같은 AuditLog에 대한 모의 객체를 가지고 있고, AuditLog 인스턴스가 실제로 아래 코드에서 생성하여 auditlogRepositoryMock.save 호출에 전달 된 때부터, 어느 쪽도 실제로 테스트중인 코드에서 사용되지 않습니다 의심 전화로 테스트

AuditLog auditor = Helper.buildAuditor(authentic); 

당신이 정말로 테스트에서이 인수를 제어해야하는 경우, 당신은 당신이 할 수 있도록 테스트하는 코드를 변경해야 할 수도 있습니다. 당신이 정말로 전달 된 AuditLog의 가치에 대해 걱정하지 않는 경우

, 당신은 Matcher 더 허용을 사용하도록 스텁을 변경할 수 있습니다, 아마도 뭔가 같은 :

when(auditlogRepositoryMock.save(argThat(any(AuditLog.class)))).thenReturn(createdAuditLog); 

에 저장소 모의을 일으킬해야하는 save의 모든 호출에 대해 시험 값 createdAuditLog을 반환하십시오.

0

Mockito는 메서드 호출에서 개체를 반환 할 수 있습니까?

예, 변경할 수, 모의 객체, 스텁을 반환 실제 방법이나 다른 행동, 예를 호출하는 기본값 null에서 @Mock 주석의 Answers

+0

조언 해 주셔서 감사합니다. 사용을 종료했습니다 : when (auditlogRepositoryMock.save (Matchers.any (AuditLog.class))) .thenReturn (createdAuditLog); @Mock (응답 = RETURNS_MOCK)이 java.lang.ClassCastException을 반환했기 때문에 : org.mockito.internal.creation.jmock.ClassImposterizer $ ClassWithSuperclassToWorkAroundCglibBug $$ EnhancerByMockitoWithCGLIB $$ 463b1068는 com.edelweissco.dental.model.AuditLog로 전송할 수 없습니다. – sonoerin

관련 문제