Не могу проверить похитителя в Мокито - PullRequest
0 голосов
/ 27 июня 2019

Написал следующий тест:

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: Аргумент передан для проверки () имеет тип Unit и не является насмешкой!Убедитесь, что вы поставили круглые скобки правильно!Смотрите примеры правильных проверок: verify (mock) .someMethod ();verify (mock, times (10)). someMethod ();verify (mock, atLeastOnce ()). someMethod ();

Ответы [ 2 ]

1 голос
/ 28 июня 2019

Вот как вы пишите, проверяйте, используя макет

Mockito.verify(notificationManager).createNotificationChannel(captor.capture()));
0 голосов
/ 27 июня 2019

Как вы определили

notificationManager

Используя MockitoAnnotations, вы можете определить поле следующим образом в своем тесте

@Mock
NotificationManager notificationManager

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

ПРИМЕЧАНИЕ: чтобы шпионить за классомэто должен быть или фиктивный, или настоящий объект, за которым следили.т.е.

  val notificationManagerSpy: spy(notificationManager)

Если вы используете тестовый фреймворк, такой как Robolectric , у вас будет real 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 для получения дополнительной информации о шпионаже и о том, что является допустимым шпионским объектом.

...