【问题标题】:Decode Using Base64 Not Working In Unit Tests For PowerMockito使用 Base64 解码在 PowerMockito 的单元测试中不起作用
【发布时间】:2020-04-08 19:48:42
【问题描述】:

如何编写单元测试以使用 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 解决这个问题?解码总是返回 null。但是,在 junit 测试之外进行测试时,我收到了正确的值。

【问题讨论】:

    标签: android unit-testing junit powermockito


    【解决方案1】:

    对于遇到同样问题的人来说,您在网上找到的解决方案并不是那么简单。许多人建议使用 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() 方法。无需担心要使用哪个特定版本的 PowerMockito,因为某些版本有错误而其他版本没有。真的很容易。干杯!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多