Вы не должны проверять свой код таким образом.Вы должны создать интерфейс для класса, который хотите смоделировать:
interface MySharedPreferences {
fun getAccessToken(): String
}
Пусть ваш SharedPreferencesHandler реализует этот интерфейс.Затем в своем презентаторе (или другом классе, который вы хотите протестировать) вставьте зависимости (например, с помощью конструктора или фреймворка, например, Dagger / Kodein) в ваш объект.Тогда есть возможность легко издеваться над этим интерфейсом.Я предполагаю, что в @Before вы создаете класс, который вы тестируете, а затем просто передаёте в качестве параметра свой поддельный SharedPreferencesHandler.
Тестирование со статическими зависимостями возможно, но сложно, но многие люди считают статические зависимости антивирусными.-шаблон).Как это сделать, описано здесь: Как выполнить юнит-тестирование Android и макетировать статический метод
Пример:
class MyPresenter(val sp: MySharedPreferences) {
/* some code here */
fun validateToken() {
if (sp.getAccessToken() == "") throw new Exception()
}
}
Как вы видите, sp
вводится вэтот класс в качестве параметра.Обычно вы не создаете представления / докладчиков и т. Д. Непосредственно в коде, а с помощью DI-фреймворка (например, Dagger или Kodein).В любом случае, статические зависимости непросто проверить.Внедренные зависимости интерфейса могут быть смоделированы, и вы работаете не с объектом, а с поведением (так что это больший уровень абстракции).Итак, теперь в вашем тесте все, что вам нужно сделать, это:
class MyTest() {
@Mock lateinit var sharedPreferencesMock: MySharedPreferences
lateinit var instance: MyPresenter
@Before
fun setUp() {
instance = MyPresenter(sharedPreferencesMock)
}
@Test
fun testSomething() {
`when`(sharedPreferencesMock.getAccessToken()).thenReturn("myAccessToken")
/* here is your test body */
}
}