如何模拟一个 void 方法,该方法采用模拟对象并期望为模拟对象实例设置一些值



我有一个代码,我需要将某种类型的任何模拟对象实例传递给方法,并希望同一个模拟实例设置一些值作为回报。

由于这是一个 void 方法,我正在使用 doAnswer 为传入的参数设置一些值。在这种情况下,参数是模拟对象。

现在的问题是,有没有办法将值设置为模拟对象并使用相同的实例来断言某些东西?

我用doAnswer尝试了void方法。还有其他方法可以实现这一点吗?

doAnswer(new Answer() {
    ManageKit manageKit = new ManageKit();
    @Override
    public Object answer(InvocationOnMock invocation) throws Throwable {
        Object[] arguments = invocation.getArguments();
        if (arguments != null && arguments.length == 1 && arguments[0] != null ) {
            manageKit = (ManageKit)arguments[0];
            manageKit.setStudySchemaEventId(12);
        }
        return manageKit;
    }
}).when(mockManageKitsDao).retrieveInterventionEventId(any(ManageKit.class), any(Connection.class));
TileInfo tileInfo = doubleBliService.getTileInfo(9500, 5);
assertThat(manageKit.getStudySchemaEventId()).isEqualTo(12);

我不能直接传递ManageKit对象,因为它正在方法中创建对象。 如下所示:

public TileInfo getTileInfo(int studyId, int caseDetailId) {
.......
........
ManageKit manageKit = new ManageKit();
manageKit.setCaseDetailId(caseDetailId);
manageKitsDao.retrieveInterventionEventId(manageKit, connection);
int armStudySchemaEventId = 0;
if (manageKit.getStudySchemaEventId() != null && manageKit.getStudySchemaEventId() != 0) {
    armStudySchemaEventId = manageKit.getStudySchemaEventId();
}

Mockito提供了一种机制,用于获取传递到模拟方法的abject实例:ArgumentCaptor。

在您的特定情况下(示意图(:

// configure
doAnswer(answer).when(mockManageKitsDao).retrieveInterventionEventId(any(ManageKit.class), any(Connection.class));
// act
TileInfo tileInfo = doubleBliService.getTileInfo(9500, 5);
// verify
ArgumentCaptor<ManageKit> argumentCaptor = ArgumentCaptor.forClass(ManageKit.class);
verify(mockManageKitsDao).retrieveInterventionEventId(argumentCaptor.capture(), any(Connection.class));
ManageKit manageKit = argumentCaptor.getValue();
assertThat(manageKit.getStudySchemaEventId()).isEqualTo(12);

相关内容

  • 没有找到相关文章

最新更新