模拟返回值



我使用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,除了原语。但是我的代码将对一个返回值进行操作。所以我的问题是有没有一种方法来测试这个没有得到空指针?Mockito可以从方法调用返回一个对象吗?

您在测试中有AuditLog的模拟作为字段和局部变量,我怀疑在测试代码中都没有实际使用,因为传递给auditlogRepositoryMock.save调用的AuditLog实例实际上是由调用

在测试代码中创建的
AuditLog auditor = Helper.buildAuditor( authentic );

如果您真的需要在测试中控制这个参数,您可能需要更改您正在测试的代码以允许这样做。

如果您真的不关心传入的AuditLog的值,您可以更改存根以使用更宽松的Matcher,可能像:

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

,这将导致存储库模拟为所有save调用返回测试值createdAuditLog

Mockito可以从方法调用返回一个对象吗?

是的,你可以改变@Mock注释的答案从默认值null返回模拟,存根,调用真正的方法或其他行为,例如

@Mock(answer = RETURNS_MOCKS)
AuditLogRepository auditlogRepositoryMock;

相关内容

  • 没有找到相关文章

最新更新