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,除了原语。但是我的代码将根据返回值进行操作。所以我的问题是有没有办法在不获取空指针的情况下进行测试?Mockito 可以从方法调用中返回一个对象吗?

4

2 回答 2

1

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

AuditLog auditor = Helper.buildAuditor( authentic );

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

如果您并不真正关心AuditLog传入的值,则可以更改存根以使用更宽松的 stub Matcher,可能类似于:

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

这应该会导致您的存储库模拟返回createdAuditLog所有调用的测试值save

于 2013-05-26T20:40:22.413 回答
0

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

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

@Mock(answer = RETURNS_MOCKS)
AuditLogRepository auditlogRepositoryMock;
于 2013-05-26T20:43:23.937 回答