У меня есть класс, в котором переменная инициализируется в блоке 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)) }
}
}