Mockito any () для параметра лямбда в Android - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть класс, в котором переменная инициализируется в блоке init

class MyClass(private val appSharedPreferences: AppSharedPreferences) {
    private val data 

    init{
        data = appSharedPreferences.getList("test_key") { it.toLong() }
    }
    // .......................;
}

В модульном тесте я хочу смоделировать этот метод, чтобы вернуть предопределенный список.

@RunWith(MockitoJUnitRunner::class)
class MyClassTest {

    @Mock
    private lateinit var appSharedPreferences: AppSharedPreferences;

    @Before
    fun init() {
        MockitoAnnotations.initMocks(this)
    }

    @Test
    fun test() {
        // init
        `when`(appSharedPreferences.getList("test_key", any())).thenReturn(listOf(1L))

        val myClass = MyClass(appSharedPreferences)
    }
}

Проблема в том, что при запуске теста у меня возникает проблема:

e: org.jetbrains. kotlin .codegen.CompilationException: Back-end (JVM) Внутренняя ошибка: не удалось сгенерировать выражение: KtBlockExpression Файл, скомпилированный в позиции: (52,51) в C: /.............../ MyTest.kt Причина root java .lang.IllegalStateException было сгенерировано по адресу: org.jetbrains. kotlin .codegen.state.KotlinTypeMapper $ typeMappingConfiguration $ 1.processErrorType (KotlinTypeMapper.kt: 113) в org.jetbrains. kotlin генерируемый код. (ExpressionCodegen. java: 324) в org.jetbrains. kotlin .codegen.ExpressionCodegen.genStatement (ExpressionCodegen. java: 407)

Если вместо any() я поставлю { it.toLong()} нет проблем во время выполнения, но when не работает и метод не возвращает значение listOf(1L).

Есть идеи, как заставить его работать правильно?

ОБНОВЛЕНИЕ

Вот код AppSharedPreferences


interface AppSharedPreferences {
    fun <T : Any> getList(key: String, transformation: (String) -> T): List<T>?
    // ......
}

И это реализация

class SharedPreferencesService(_context: Context,
                               _customSharedPreferencesFileName: String,
                               private val sharedPreferencesEncoder: SharedPreferencesEncoder) : AppSharedPreferences {

    // .....
    override fun <T : Any> getList(key: String, transformation: (String) -> T): List<T>? {
        if (!exist(key)) {
            return null
        }
        val strEncodedList = get(key, "")
        if (strEncodedList.isEmpty()) {
            return emptyList()
        }
        return strEncodedList.split(listItemSeparator)
                .map { transformation(sharedPreferencesEncoder.decode(it)) }
    }
}
...