简体   繁体   中英

java.lang.StackOverflowError while JUNIT testing

I want to learn how to create unit tests. I've never done this before so I read some tutorial and I tried to test my addTraining to Day method. But when I did my test method (imo I wrote this right way) I have java.lang.StackOverflowError. Can someone help me with that? I dont know what to do.

This is method I want to test, I think I have to create three cases to test this right?

    public void addTraining(String userId, Training training, LocalDate localDate) {
      Day activityBoardDay = getActivityBoardDay(localDate, userId);
      List<Training> trainingList = activityBoardDay.getTrainings();
      if (trainingList == null || trainingList.isEmpty()) {
        activityBoardDay.setTrainings(Collections.singletonList(training));
      } else {
        trainingList.add(training);
        activityBoardDay.setTrainings(trainingList);
      }
      activityBoardDay.setTrainings(trainingList);
  }

And this is my Test class:

@RunWith(MockitoJUnitRunner.class)
public class ActivitiesServiceTest {


@Mock
private DbService databaseControllerMock;


private ActivitiesService activitiesService;

private String userId = "test";


@Before
public void setUp() throws Exception {
    activitiesService = new ActivitiesService(databaseControllerMock);
}

@After
public void tearDown() throws Exception {
    getDayWithNulls().setTrainings(null);
    getDayWithNulls().setMeasurements(null);
    getDayWithNulls().setTrainingCycles(null);
    getDayWithNulls().setDiets(null);
    getDayWithNulls().setMeals(null);
    getDayWithNulls().setLocalDate(LocalDate.now());
}


@Test
public void addTraining() {
    //WITH NULLS
    getDayWithNulls();
    activitiesService.addTraining(userId, getTrainingForTest(), LocalDate.now());
    Assert.assertEquals(getDayWithNulls(), expectedDayWithAddedTrainingToNulls());

}


private Exercise getSquatExcercise() {
    Exercise exercise = new Exercise();
    exercise.setId("1");
    exercise.setName("Squat");
    exercise.setDescription("How to squat properly?");
    exercise.setCalories(3);
    exercise.setNotes("Calories per one squat");
    return exercise;
}

private Exercise getRunExcercise() {
    Exercise exercise = new Exercise();
    exercise.setId("2");
    exercise.setName("Run");
    exercise.setDescription("How to run properly?");
    exercise.setCalories(3);
    exercise.setNotes("Calories per one running session");
    return exercise;
}

private Exercise getWalkExcercise() {
    Exercise exercise = new Exercise();
    exercise.setId("3");
    exercise.setName("Walk");
    exercise.setDescription("How to walk properly?");
    exercise.setCalories(3);
    exercise.setNotes("Calories per one walking session");
    return exercise;
}

private Training getTrainingForTest() {
    Training training = new Training();
    List<Exercise> exercises = new ArrayList<>();
    exercises.add(getRunExcercise());
    exercises.add(getSquatExcercise());
    exercises.add(getWalkExcercise());
    training.setExerciseList(exercises);
    return training;
}

private Day getDayWithNulls() {
    getDayWithNulls().setTrainings(null);
    getDayWithNulls().setMeasurements(null);
    getDayWithNulls().setTrainingCycles(null);
    getDayWithNulls().setDiets(null);
    getDayWithNulls().setMeals(null);
    getDayWithNulls().setLocalDate(LocalDate.now());
    return getDayWithNulls();
}

private Day expectedDayWithAddedTrainingToNulls() {
    expectedDayWithAddedTrainingToNulls().setTrainings(Collections.singletonList(getTrainingForTest()));
    expectedDayWithAddedTrainingToNulls().setMeasurements(null);
    expectedDayWithAddedTrainingToNulls().setTrainingCycles(null);
    expectedDayWithAddedTrainingToNulls().setDiets(null);
    expectedDayWithAddedTrainingToNulls().setMeals(null);
    expectedDayWithAddedTrainingToNulls().setLocalDate(LocalDate.now());
    return expectedDayWithAddedTrainingToNulls();
}
}

getDayWithNulls() is calling itself, which leads to infinite recursion and StackOverflowError . getDayWithNulls() should probably call some other method to generate the Day instance that it returns.

private Day getDayWithNulls() {
    Day day = ... // call some method to create a Day instance,
                  // but don't call getDayWithNulls() !

    day.setTrainings(null);
    day.setMeasurements(null);
    day.setTrainingCycles(null);
    day.setDiets(null);
    day.setMeals(null);
    day.setLocalDate(LocalDate.now());

    return day;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM