2017-02-16 97 views
1

我在我当前的应用程序中为我的数据模型创建了custom deserializer,并且在我的CustomDeserializer中试图初始化Pair<>时遇到一些问题。我从我的Json我的项目A和B收回,他们都很好,并从JsonObject正确初始化,但是当我要与他们建立一个new Pair<>(A,B)我发现了一个例外:无法初始化Gson自定义解串器中的Android.Util.Pair

方法抛出“的java.lang .RuntimeException'异常。不能评价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<>

希望有人能够帮我一把!

回答

1

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

考虑使用Robolectric lib来模拟android类,或者在你的代码中抽象它们并且不使用结构(Android Framework类)并使用这个抽象并用Mockito来嘲弄它们。