Декодирование с использованием Base64 не работает в модульных тестах для PowerMockito - PullRequest
0 голосов
/ 08 апреля 2020

Как мне написать модульные тесты для работы с декодированием Base64?

У меня есть следующий тест

@RunWith(PowerMockRunner::class)
@PrepareForTest(Log::class)
class JwtDeserializerTest {

    @Before
    fun setup() {
        PowerMockito.mockStatic(Log::class.java) // this helped with Runtime exception for having Log in my code
        PowerMockito.mockStatic(Base64::class.java)
    }

    @Test
    fun testJwtToken() {
        val jwt = Jwt(jwt_token)
        val expirationDateTimeFromJwtClaims = jwt.getClaim("exp")?.asLong() ?: 0L
        assertTrue(expirationDateTimeFromJwtClaims != 0L)
    }
}

Конфликт возникает, когда следующий код запускается внутри для создания экземпляра объекта Jwt .

fun decodeFromBase64(value: String): String {
    try {
        val data = Base64.decode(value, Base64.DEFAULT)
        if (data != null) {
            return String(data, charset("UTF-8"))
        }
    } catch (e: UnsupportedEncodingException) {
        Log.e(TAG, e.message, e)
    }
    return ""
}

Во время создания экземпляра я декодирую токен JWT и настраиваю некоторые вспомогательные методы при рассмотрении заявок. Это включает в себя проверку количества частей токена, например, заголовка, полезной нагрузки, подписи и т. Д.

Во время отладки декодирование вызывает проблему. У меня была похожая проблема с функцией Log, но добавление PowerMockito.mockStatic(Log::class.java) разрешило этот конфликт.

Как я могу решить эту проблему для Base64? Декодирование всегда возвращает ноль. Однако при тестировании вне теста junit я получаю правильные значения.

1 Ответ

0 голосов
/ 08 апреля 2020

Для тех из вас, кто сталкивается с той же проблемой, решения, которые вы найдете в Интернете, не так просты. Многие предлагают использовать PowerMockito. Оказывается, использовать RobolectricTestRunner

намного проще. Я внес следующее изменение, и теперь все работает отлично.

@RunWith(RobolectricTestRunner::class)
class JwtDeserializerTest {

    @Test
    fun testJwtToken() {
        val jwt = Jwt(jwt_token)
        val expirationDateTimeFromJwtClaims = jwt.getClaim("exp")?.asLong() ?: 0L
        assertTrue(expirationDateTimeFromJwtClaims != 0L)
    }
}

Нет необходимости в методе setup (). Не нужно беспокоиться о том, какую конкретную c версию PowerMockito использовать, поскольку в некоторых версиях есть ошибки, а в других нет. Было действительно легко. Ура!

...