Android Studio 3.5.3
Kotlin 1.3
Estou tentando testar algum código simples, mas continuo recebendo a seguinte exceção:
IllegalStateException: gsonWrapper.fromJson<Map…ring, String>>() {}.type) must not be null
Estou usando o espião e zombando do retorno para que ele retorne um valor nulo. Como eu quero testar o caminho do erro.
Não tenho certeza se estou fazendo algo errado com o meu stubbing ou não. Mas parece que não consigo resolver essa exceção.
Usando uma classe wrapper para agrupar a implementação gson e espionando isso no teste
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);
}
}
Implementação da minha classe que está em teste
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
}
A classe de teste real, mantendo tudo simples
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
}
}
Muito obrigado por todas as sugestões,
fonte
non-null
. Eu acho que o que estou tentando alcançar é retornar um mapa que tenha conteúdo nulo. Então, quandomovieMap.getOrElse()
retornará um nulo. Era isso que eu estava tentando zombar. Ter o movieMap contendo um nulo é algo que não sei ao certo como fazer ?.Com sua configuração que você está procurando, em
emptyMap()
vez denull
Isso cumprirá a assinatura, pois não é nulo
Além disso, ele inserirá o bloco else na
movieMap.getOrElse()
chamada.fonte