2017-02-16 96 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來嘲弄它們。