2017-02-16 22 views
1

私の現在のアプリケーションでデータモデルにcustom deserializerを作成しています。Pair<>CustomDeserializerに初期化しようとすると問題が発生します。私は私の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テストでは、このテストがローカルのjvmで実行されているため、アンドロイドコード(android.util.Pair)を参照することはできません。このクラスを初期化する必要はありません。

アンドロイドクラスを模擬したり、コードで抽象化したり、コンセプトを使用したり(Android Frameworkクラス)、この抽象化を使用してMockitoをモックするには、Robolectric libを使用することを検討してください。

関連する問題