Как смоделировать системный класс для приведения типов - PullRequest
1 голос
/ 29 июня 2019

У меня есть следующий код для получения текущей системной памяти:

val memClass = (context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager).memoryClass

Моя первоначальная цель - вернуть значение Int для него при тестировании. Как то так:

whenever((context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager).memoryClass)
.thenReturn(500)

Так как это тест jUnit и включает использование Context, я закончил издеваться над всем:

val context: Context = mock()

val activityService: Service = mock()

whenever(context.getSystemService(Context.ACTIVITY_SERVICE))
            .thenReturn(activityService)

whenever((context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager).memoryClass)
            .thenReturn(500)

Теперь проблема в том, что Mockito не может создать тип-трансляцию для ActivityManager и выдает эту ошибку:

java.lang.ClassCastException: android.app.Service$MockitoMock$594525704 cannot be cast to android.app.ActivityManager

Я также пытался насмехаться над ActivityManager, но его нельзя использовать в качестве набора типов:

enter image description here

У меня нет особых требований придерживаться текущего решения. Я буду признателен за лучший подход к моей первоначальной цели.

1 Ответ

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

Может быть, у нас недоразумение. То, о чем я говорю, было так:

val context: Context = mock()

val activityService: ActivityManager = mock()

whenever(context.getSystemService(Context.ACTIVITY_SERVICE))
            .thenReturn(activityService)

whenever((context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager).memoryClass)
            .thenReturn(500)

Насколько я понимаю: context.getSystemService (...) возвращает объект.

Нет связи между классами android.app.ActivityManager и android.app.Service.


Редактировать:

Последнюю строку, возможно, придется заменить на эквивалент
(данный код, вероятно, не соответствует синтаксису котлина)

    when(activityService.memoryClass).thenReturn(500);
...