模拟返回值

时间:2013-05-26 20:13:26

标签: java mockito

我正在使用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可以从方法调用中返回一个对象吗?

2 个答案:

答案 0 :(得分:0)

您的AuditLog模拟了测试中的字段和局部变量,我怀疑测试中的代码实际上都没有使用,因为AuditLog实例传递给了您的{{ 1}}调用实际上是在调用的代码中通过调用

创建的
auditlogRepositoryMock.save

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

如果你真的不关心传入的AuditLog auditor = Helper.buildAuditor( authentic ); 的值,你可以更改你的存根以使用更宽松的AuditLog,可能类似于:

Matcher

这会导致您的存储库模拟为when( auditlogRepositoryMock.save( argThat(any(AuditLog.class)) ) ).thenReturn(createdAuditLog ); 的所有调用返回测试值createdAuditLog

答案 1 :(得分:0)

  

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

是的,您可以将Answers注释的@Mock从默认值null更改为返回模拟,存根,调用实际方法或其他行为,例如。

@Mock(answer = RETURNS_MOCKS)
AuditLogRepository auditlogRepositoryMock;