当前位置: 首页 > 知识库问答 >
问题:

无法在Mockito中验证captor

商正诚
2023-03-14

下一个测试:

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))
}

并在我的验证中获取下一个错误:

组织。莫基托。例外。滥用。NotAMockException:传递给verify()的参数是Unit类型,不是模拟!确保正确放置括号!请参阅正确验证的示例:验证(模拟)。somethod();验证(模拟,第10次)。somethod();验证(模拟,至少一次()。somethod();

共有2个答案

谈禄
2023-03-14

你是怎么定义的

notificationManager

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

@Mock
NotificationManager notificationManager

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

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

  val notificationManagerSpy: spy(notificationManager)

如果你正在使用一个测试框架,比如Robolectic,你将会有一个真正的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有关间谍活动的更多信息以及什么是有效的间谍对象。

西门威
2023-03-14

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

Mockito.verify(notificationManager).createNotificationChannel(captor.capture()));
 类似资料:
  • 使用Mockito示例页面中最基本的示例,我能够在JUnit中成功运行。 然而,当我在斯波克运行相同的测试时,它失败了。 JUnit/Java版本(通过): Spock/Groovy版本(此失败): 以下是斯波克测试失败时出现的错误: 有什么想法或建议吗?我真的很喜欢斯波克和莫奇托,希望他们能很好地合作。非常感谢!

  • 我们的旧系统使用.NET 3.5(运行在Windows Server 2003 32bits上)来验证来自我们客户的电子收据(都使用SHA1RSA算法作为协议)。我们将他们的证书以Base64字符串存储在数据库中。旧代码如下所示: 除了性能不好外,没有其他问题。这就是为什么我们想要转移到使用Java1.7的新系统(运行在Windows Server 2012 64位上)。我们的新代码如下所示: 我

  • Mockito似乎获得了越来越多的PowerMockito功能。 当我更新到 测试失败了。 所以我试图摆脱PowerMokito。 问题是没有验证静态https://www.javadoc.io/doc/org.powermock/powermock-api-mockito/latest/org/powermock/api/mockito/PowerMockito.html#verifyStati

  • 问题内容: 我正在尝试通过Bootstrap激活验证,并且已粘贴到页面上的follownig示例中。 我可以看到输入控件的外观发生了变化(现在有点圆了,现在更加美观了), 但是 它仍然没有显示绿色边框,就像在链接到的页面上可以看到的那样。我要链接到的Bootstrap指出如下。 尝试用googlearch问题,我只获得示例链接到从中获得示例的官方站点,因此在此方面几乎没有什么帮助。我在摆弄这个问题

  • 我正在Junit上工作 这就是我所做的。我已发出请求,并且我的请求已成功调用我的控制器。当我尝试使用要测试是否调用了静态方法,我得到一个错误,如下所示。 我得到的错误是: 我的问题是: > 我可以使用在我的方法。如果"是"如何? 我还想在上使用验证。我该怎么做呢? 任何帮助都是值得赞赏的。

  • 在测试中,我使用的是mockobject: 我试图验证其方法的使用: 但它抛出以下异常: 组织。莫基托。例外情况。滥用。UnfinishedVerificationException:此处缺少验证(模拟)的方法调用: 这一行的例外点是: setMaxRows接受一个int。 当我注释掉这一行时,测试成功了。调试程序时,我可以看到正在设置的setMaxRows方法: BrandLabels是一个Li