С модульным тестированием нужно написать тесты для каждой функции по отдельности.
Например, для функции saveToken, когда приходит token, ответ функции должен быть true или false в зависимости от тестового сценария. Когда вызываем геттер token, функция должна вернуть токен, хранящийся в SecureStorage. Для функции login, нужно вернуть true или false в зависимости от переданных на вход email и password.
Помимо тестирования ответа, зависящего от входных данных, также можно протестировать, была ли вызвана функция apiClient.login или сколько раз она была вызвана. Если ее не вызывали или делали это больше одного раза, то в коде скорее всего есть баг.
Написание Unit-тестов — лишь необходимое условие для того, чтобы удостовериться, что приложение работает корректно.
На примере выше намеренно допущена ошибка, где сохранили его в SharedPreferences и попытались достать токен из SecureStorage, из которого точно не получится достать нужный.
Почему Unit-тесты не могут поймать эту ошибку? Они сфокусированы на тестировании каждой функции по отдельности. Функция saveToken используется для сохранения токена в SharedPreferences, и она не знает, будет ли он получен именно оттуда.
Аналогично, геттер token используется только для получения токена из SecureStorage и ему все равно, где он был сохранен. Когда каждая функция выполняется корректно, проходят и Unit-тесты. Но при запуске приложения эти 2 функции будут вызывать ошибку, тогда на помощь приходят интеграционные тесты.