android - 在测试类中模拟和监视时获取空指针异常

标签 android unit-testing kotlin mockito

Android Studio 3.5.3
Kotlin 1.3

我正在尝试测试一些简单的代码,但我不断收到以下异常:
IllegalStateException: gsonWrapper.fromJson<Map…ring, String>>() {}.type) must not be null

我正在使用 spy 并模拟返回,因此它将返回空值。因为我想测试错误路径。

不确定我的 stub 是否做错了什么。但似乎无法解决此异常。

使用包装类来包装 gson 实现并在测试中对此进行监视
public class GsonWrapper implements IGsonWrapper {

    private Gson gson;

    public GsonWrapper(Gson gson) {
        this.gson = gson;
    }

    @Override public <T> T fromJson(String json, Type typeOf) {
        return gson.fromJson(json, typeOf);
    }
}

我正在测试的类(class)的实现
class MoviePresenterImp(
        private val gsonWrapper: IGsonWrapper) : MoviePresenter {

    private companion object {
        const val movieKey = "movieKey"
    }

    override fun saveMovieState(movieJson: String) {
            val movieMap = serializeStringToMap(movieJson)

            when (movieMap.getOrElse(movieKey, {""})) {
                /* do something here */
            }
    }

    // Exception return from this method
    private fun serializeStringToMap(ccpaStatus: String): Map<String, String> =
            gsonWrapper.fromJson<Map<String, String>>(ccpaStatus, object : TypeToken<Map<String, String>>() {}.type) // Exception
}

实际的测试类,只是保持一切简单
class MoviePresenterImpTest {
    private lateinit var moviePresenterImp: MoviePresenterImp
    private val gsonWrapper: GsonWrapper = GsonWrapper(Gson())
    private val spyGsonWrapper = spy(gsonWrapper)

    @Before
    fun setUp() {
        moviePresenterImp = MoviePresenterImp(spyGsonWrapper)
    }

    @Test
    fun `should not save any movie when there is an error`() {
        // Arrange
        val mapType: Type = object : TypeToken<Map<String, String>>() {}.type
        whenever(spyGsonWrapper.fromJson<Map<String, String>>("{\"movie\":\"movieId\"}", mapType)).thenReturn(null)

        // Act
        moviePresenterImp.saveMovieState("{\"movie\":\"movieId\"}")

        // Assert here
    }
}

非常感谢您的任何建议,

最佳答案

我在这里发现了问题:

您必须使用可为空的 map 吗?而不是 MoviePresenterImp(Kotlin 代码)中的非 null Map,因为在 Unit Test 类中,您监视 gsonWrapper,并且强制方法“spyGsonWrapper.fromJson”返回 null。

现在好了。

fun saveMovieState(movieJson: String) {
        val movieMap = serializeStringToMap(movieJson)

        when (movieMap?.getOrElse(movieKey, { "" })) {
            /* do something here */
        }
    }

    // Exception return from this method
    private fun serializeStringToMap(ccpaStatus: String): Map<String, String>? {
        val type: Type =
            object : TypeToken<Map<String, String>>() {}.type
        return gsonWrapper.fromJson(ccpaStatus, type) // Exception
    }

关于android - 在测试类中模拟和监视时获取空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59326747/

相关文章:

python - TransactionManagementError "You can' t 在使用信号时执行查询直到 'atomic' block 结束,但仅在单元测试期间

java - 如何模拟 @InjectMocks 类中的方法?

ruby-on-rails - 我如何在 FactoryGirl 中为循环关联创建工厂?

android - whereArrayContains 限制为 10

android - Kotlin 协程 `runBlocking`

android - Android如何接收来电[MM]?

java - 安卓相机 : app passed NULL surface

kotlin - 如何从枚举在 Kotlin 中创建编译时常量?

android - Android 上 Google Fit 的 OAuth 2.0 客户端 ID 的用途是什么

java - 如何按 _id 和另一列对 SQLite 数据进行排序