2017-02-16 48 views
1

Я создаю для моей модели данных custom deserializer, и у меня возникают некоторые проблемы при попытке инициализировать Pair<> внутри моего CustomDeserializer. Я оправиться от моего Json моих пунктов А и В, они отлично и правильно инициализированы с JsonObject, но когда я хочу, чтобы создать new Pair<>(A,B) с ними я получаю исключение:Невозможно инициализировать Android.Util.Pair внутри настраиваемого десериализатора Gson

Метод бросил «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 полный от нуля Pair<>.

Надеюсь, что кто-то сможет дать мне руку!

ответ

1

В вашем тестировании Junit вы не можете ссылаться на код андроида (android.util.Pair), потому что этот тест выполняется в вашем локальном jvm и не имеет этого класса для инициализации.

Используйте Robolectric lib, чтобы издеваться над андроидными классами или абстрагировать их в своем коде и не использовать конкреции (класс Android Framework) и использовать эти абстракции и имитировать их с помощью Mockito.

 Смежные вопросы

  • Нет связанных вопросов^_^