2013-05-26 2 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 всегда будет возвращать нуль, за исключением примитивов. Но мой код будет действовать на возвращаемое значение. Итак, мой вопрос - есть ли способ проверить это, не получив нулевого указателя? Может ли Mockito вернуть объект из вызова метода?

+4

Я по-прежнему привык к самому Моккито (использовал его только около 4 месяцев), поэтому опубликую это как комментарий, а не ответ. Я считаю, что вы говорите, что возвращаете 'createdAuditLog', когда вы вызываете' save() 'с объектом (' aLog'). Я использую класс 'Matcher' для установки, когда/thenReturns. Подобно этому 'when (auditlogRepositoryMock.save (Matchers.any (AuditLog.class)). ThenReturn (createdAuditLog);' – Kyle

+0

yes, mockito может возвращать объекты, можете ли вы предоставить больше информации о своем nullpointer? – Vegard

+0

@Kyle с моей точки зрения ваш комментарий правильный. Когда метод save не вызывается с экземпляром aLog, возврат не будет использоваться, а mockito будет использовать свое поведение по умолчанию. Без полного кода это лучший ответ, чтобы дать. Поэтому опубликуйте его как ответ;). – mszalbach

ответ

0

Вы издевается для AuditLog как оба поля и локальной переменной в тесте, и я подозреваю, ни фактически не используется в коде тестируемой, так как экземпляр AuditLog передается на ваш auditlogRepositoryMock.save вызов фактически создается в коде под тест по зову

AuditLog auditor = Helper.buildAuditor(authentic); 

Если вам нужно действительно контролировать этот аргумент из теста, возможно, потребуется изменить код, который вы тестируете, чтобы позволить.

Если вы не очень заботятся о стоимости AuditLog прошло, вы можете изменить свой окурок использовать более снисходительными Matcher, возможно, что-то вроде:

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

, который должен привести к вашему хранилищу издеваться к вернуть тестовое значение createdAuditLog для всех вызовов save.

0

Может ли Mockito вернуть объект из вызова метода?

Да, вы можете изменить Answers в @Mock аннотации от значений по умолчанию null для возврата издевается, окурки, называют реальные методы или другое поведение, например,

+0

Спасибо за совет, я закончил использование: когда (auditlogRepositoryMock.save (Matchers.any (AuditLog.class))) .thenReturn (createdAuditLog); Поскольку @Mock (answer = RETURNS_MOCK) возвращал java.lang.ClassCastException: org.mockito.internal.creation.jmock.ClassImposterizer $ ClassWithSuperclassToWorkAroundCglibBug $$ EnhancerByMockitoWithCGLIB $$ 463b1068 нельзя отнести на com.edelweissco.dental.model.AuditLog – sonoerin

Смежные вопросы