java - 无法在 Gson 自定义解串器中初始化 Android.Util.Pair

标签 java android json junit deserialization

我正在创建一个 custom deserializer对于我当前应用程序中的数据模型,我在尝试初始化 Pair<> 时遇到了一些问题在我的里面 CustomDeserializer .我从我的 Json 中恢复了我的项目 A 和 B,它们很好并且从 JsonObject 正确初始化,但是当我想创建一个 new Pair<>(A,B)与他们一起我得到一个异常(exception):

Method threw 'java.lang.RuntimeException' exception. Cannot evaluate android.util.Pair.toString()

我一直在寻找更多有同样问题的人,但我找不到任何关于这个的提示,我不知道为什么我不能在 deserializer 中初始化项目.我在 junit 中执行所有代码测试,所以可能是由此引起的,但我不知道为什么。这是我的代码 deserializer :

public class CustomSetDeserializer implements JsonDeserializer<ExerciseSet> {

   private List<Exercise> exerciseList;

   public CustomSetDeserializer(List<Exercise> exerciseList) {
      this.exerciseList = exerciseList;
   }

   @Override
   public ExerciseSet deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
      List<Pair<Exercise, Integer>> setExercises = new ArrayList<>();
      JsonArray exercisesJsonArray = json.getAsJsonObject().get("exercises").getAsJsonArray();
      for (JsonElement jsonElement : exercisesJsonArray) {
         String name = jsonElement.getAsJsonObject().get("name").getAsString();
         int reps = jsonElement.getAsJsonObject().get("reps").getAsInt();
         Exercise exercise = getExercise(name);
         setExercises.add(new Pair<>(exercise, reps));
      }
      int exercisesPerRound = json.getAsJsonObject().get("exercisesPerRound").getAsInt();
      int restBetweenRounds = json.getAsJsonObject().get("restBetweenRounds").getAsInt();
      ExerciseSet set;
      switch (exercisesPerRound) {
         case 3:
            //TODO TRISET  
            set = new SimpleSet(setExercises, restBetweenRounds);
            break;
         case 2:
            //TODO SUPERSET
            set = new SimpleSet(setExercises, restBetweenRounds);
            break;
         default:
            set = new SimpleSet(setExercises, restBetweenRounds);
            break;
      }
      return set;
   }

   private Exercise getExercise(String name){
      for (Exercise exercise : exerciseList) {
         if (!exercise.name().equals(name)) continue;
         return exercise;
      }
      throw new IllegalArgumentException("Wrong exercise name");
   }
}

这是我的测试:

 @Test
   public void read_set_json() {
      CustomSetDeserializer customSetDeserializer = new CustomSetDeserializer(exercises);
      Gson gson = new GsonBuilder().registerTypeAdapter(ExerciseSet.class, customSetDeserializer).enableComplexMapKeySerialization().create();
      ExerciseSet set = gson.fromJson(setExample, ExerciseSet.class);
      assertThat(set.exercises().get(0).first.equals(exercise), is(true));
      assertThat(set.exercises().get(0).second.equals(12), is(true));
      assertThat(set.rounds(), is(4));
      assertThat(set.restBetweenRound(), is(60L));
   }

如果我调试我的代码一切正常,但是 Pair<>从未创建过,所以我总是检索 List满是 null Pair<> .

最佳答案

在您的 Junit 测试中,您不能引用 android 代码 (android.util.Pair),因为此测试是在您的本地 jvm 中执行的,并且没有要初始化的此类。

考虑使用 Robolectric lib 来模拟 android 类,或者在你的代码中抽象它们并且不要使用具体化(Android 框架类)并使用这个抽象并用 Mockito 模拟它们。

关于java - 无法在 Gson 自定义解串器中初始化 Android.Util.Pair,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42277629/

相关文章:

java - CXF wsdl2java 导致 BINDING_MISSING_TYPE

java - maven多模块依赖版本

android - Firebase 身份验证的优势?

android_app->activity->internalDataPath 在 2.3.8 NDK r8 中仍然为 NULL

jquery - 如何正确使用 Html.Raw(Json.Encode(Model)) ?

java - Java TCP/IP 套接字如何向应用程序报告传输成功或失败?

java - 如何从Spring Boot调用Python程序?

c# - 如何将图标或图片添加到 Xamarin.Android 中的 ListActivity 上的项目。

c# - 在 Azure 函数中序列化

java - 在 Java 中将 JSON 转换为 XLS/CSV