2

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();
}
}
2
  • Where's the stack trace? Commented May 22, 2018 at 13:10
  • @Eran in line getDayWithNulls().setTrainings(null); Commented May 22, 2018 at 13:16

1 Answer 1

4

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;
}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.