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/