我正在尝试使用参数捕获来确定哪些参数被传递给模拟的Mockito方法,但我无法捕获任何值。
class CombinedEvent
{
final List<String> events;
public CombinedEvent() {
this.events = new ArrayList<>();
this.events.add("WATCHITM");
this.events.add("BIDITEM");
}
}
持有人类
class CombinedNotificationAdapter {
private CombinedEvent combinedEvent;
CombinedNotificationAdapter() {
this.combinedEvent = new CombinedEvent();
}
public boolean isEnabled(String user, NotificationPreferenceManager preferenceManager) {
boolean status = true;
for (String event : combinedEvent.events) {
status = status && preferenceManager.isEventEnabled(user, event);
}
return status;
}
}
我的单元测试
@RunWith(JUnit4.class)
class CombinedNotificationAdapterTest {
private CombinedNotificationAdapter adapter;
@Mock
private NotificationPreferenceManager preferenceManager;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
adapter = new CombinedNotificationAdapter();
}
@Test
public void testIsEnabled() {
doReturn(true).when(preferenceManager).isEventEnabled(eq("test"), anyString());
Assert.assertTrue(adapter.isEnabled("test", preferenceManager));
ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
verify(preferenceManager, times(2)).isEventEnabled(eq("test"), captor.capture());
System.out.println(captor.getAllValues());
}
}
captor.getAllValues()
的输出是一个空列表。我希望这些值返回WATCHITM
和BIDITEM
的列表。 我不知道我出了什么问题。
参考:
https://static.javadoc.io/org.mockito/mockito-core/2.28.2/org/mockito/Mockito.html#15
https://static.javadoc.io/org.mockito/mockito-core/2.6.9/org/mockito/ArgumentCaptor.html
我认为你做得太过分了:
doReturn(true)
. when(preferenceManager)
.isEventEnabled(eq("test"), anyString()):
您正在清理预期的方法调用,然后将其与参数捕获器组合在一起。这是行不通的。您可以存根或捕获,而不是两者兼而有之!例如,请参阅此现有问题。
我的建议:看看这个答案,学习如何创建自己的Answer对象。这些被传递了一个InvocationOnMock的实例。该类还允许您检查传递到模拟调用中的参数!