【问题标题】:Can't verify captor in Mockito无法在 Mockito 中验证俘虏
【发布时间】:2019-06-27 12:24:13
【问题描述】:

写下一个测试:

private val mockContext = Mockito.mock(Context::class.java)
private val notificationManager = Mockito.mock(NotificationManager::class.java)

@RequiresApi(Build.VERSION_CODES.O)
@Test
@Throws(Exception::class)
fun clearNotificationsTest() {
    Mockito.`when`(mockContext.getSystemService(Context.NOTIFICATION_SERVICE)).thenReturn(notificationManager)

    val captor: ArgumentCaptor<NotificationChannel> = ArgumentCaptor.forClass(NotificationChannel::class.java)

    mockContext.registerNotificationChannels()

    Mockito.verify(notificationManager.createNotificationChannel(captor.capture()))

    val argument: NotificationChannel = captor.value

    assertThat(argument.id, equalTo(CHANNEL_ID))
    assertThat(argument.name.toString(), equalTo(CHANNEL_NAME))
    assertThat(argument.importance, equalTo(NotificationManagerCompat.IMPORTANCE_HIGH))
}

在我的verify 中得到下一个错误:

org.mockito.exceptions.misusing.NotAMockException: 传递给 verify() 的参数是 Unit 类型,不是模拟! 确保正确放置括号! 查看正确验证的示例: 验证(模拟).someMethod(); 验证(模拟,次(10))。someMethod(); 验证(模拟,atLeastOnce()).someMethod();

【问题讨论】:

  • 该测试应该做什么?对我来说,它就像你只调用模拟(mockContext和notificationManager)上的方法一样锁定,所以你没有在这里测试任何东西......
  • 并且验证的语法应该是 Mockito.verify(notificationManager).createNotificationChannel(captor.capture()),假设您想验证与 createNotificationChannel 方法的一些交互。但很可能没有,因为调用 mockContext.registerNotificationChannels() 什么都不做。

标签: android mockito verify


【解决方案1】:

这就是你使用 mock 编写验证的方式

Mockito.verify(notificationManager).createNotificationChannel(captor.capture()));

【讨论】:

  • 为什么?我写道,正是在这一行中我收到了一个错误,我也在问题中指出了这一点
  • Mockito.verify(notificationManager.createNotificationChannel(captor.capture())) 这是你的代码,但它应该像 Mockito.verify(notificationManager).createNotificationChannel(captor.capture() ));
【解决方案2】:

你是怎么定义的

notificationManager

使用 MockitoAnnotations,您可以在测试中定义如下字段

@Mock
NotificationManager notificationManager

@Before
public void setup()
{
   MockitoAnnotations.init(this);
}

注意:要监视一个类,它必须是模拟对象或已被监视的真实对象。即

  val notificationManagerSpy: spy(notificationManager)

如果您使用的是Robolectric 等测试框架,您将拥有真实 ShadowNotificationManager,因此您应该监视真实对象。解决方案如下:

@RequiresApi(Build.VERSION_CODES.O)
@Test
@Throws(Exception::class)
fun clearNotificationsTest() 
{
   val notificationManagerSpy: spy(notificationManager)
   Mockito.`when`(mockContext.getSystemService(Context.NOTIFICATION_SERVICE))
      .thenReturn(notificationManagerSpy)

    val captor: ArgumentCaptor<NotificationChannel> = 
      ArgumentCaptor.forClass(NotificationChannel::class.java)

    mockContext.registerNotificationChannels()


    Mockito.verify(notificationManagerSpy
    .createNotificationChannel(captor.capture()))

    val argument: NotificationChannel = captor.value

    assertThat(argument.id, equalTo(CHANNEL_ID))
    assertThat(argument.name.toString(), equalTo(CHANNEL_NAME))
    assertThat(argument.importance, 
    equalTo(NotificationManagerCompat.IMPORTANCE_HIGH))

请参阅:https://www.baeldung.com/mockito-spy,了解有关间谍活动的更多信息以及什么是有效的可间谍对象。

【讨论】:

  • 我更新了问题并在我为notificationManager 插入插件时显示。我也没有使用 Robolectric
猜你喜欢
  • 1970-01-01
  • 2014-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多