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

时间:2019-04-29 16:32:30

标签: java junit mockito

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

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

现在的问题是,有什么办法可以将值设置为模拟对象并使用相同的实例进行声明?

我尝试使用doAnswer的{​​{1}}方法。还有其他方法可以实现这一目标吗?

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

1 个答案:

答案 0 :(得分:1)

Mockito提供一种机制,用于获取传递给模拟方法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);