Junit для подсчета циклов - PullRequest
0 голосов
/ 29 июня 2018

Мне нужно запустить код для заданного количества раз. Мне интересно, как провести модульное тестирование этого цикла

public void executeCode(int iterations){

  for (int i = 0; i < iterations; i++)
      try {
           callToCode(parms...);
      } catch(Exception e) {
           // handle exception 
           i--;
      }
}

callToCode этот метод имеет 100% покрытие строки, но одно из требований - выполнение этого метода для заданного числа итераций.

У меня может быть переменная экземпляра для отслеживания выполнения, но каков наилучший способ для модульного тестирования такого цикла?

Я могу использовать только Junit, а не другую библиотеку

Ответы [ 2 ]

0 голосов
/ 11 июля 2018

Я бы извлек callToCode в другой класс, например

public class Caller{
    public void callToCode(String someparam){//Some logic}
} 

Тогда ваш цикл будет в другом классе с зависимостью в конструкторе:

 public class OuterClass {
    Caller caller;
    public OuterClass(Caller caller){
        this.caller = caller;
    }
    public void executeCode(int iterations){

      for (int i = 0; i < iterations; i++)
         try {
              caller.callToCode(parms...);
         } catch(Exception e) {
              // handle exception 
              i--;
         }
      }
}

Затем в своем тесте вы можете использовать Mockito.verify (вызывается 2 раза с любым параметром):

public class Test{
    OuterClass target = ...

    Caller mockeCaller = Mockito.mock(Caller.class);

    @Test
    public void test(){
       Mockito.verify(mockCaller, Mockito.times(2)).callToCode(Mockito.any());
    } 
}

С ArgumentCaptor вы также можете проверить параметры вызова метода. В большинстве случаев, если вы не можете выполнить модульное тестирование своего кода должным образом, это проблема запаха дизайна. Разделяя различные уровни абстракции в вашем коде, вы можете тестировать каждый уровень отдельно и вы получите гораздо более понятное и удобочитаемое решение.

0 голосов
/ 11 июля 2018

Если вы можете, выполните рефакторинг кода, чтобы смоделировать вызов зависимости как вызов внедренного члена.

public void executeCode(int iterations, Callable callable) {
  for (int i = 0; i < iterations; i++)
      try {
         callable.call();
      } catch(Exception e) {
         // handle exception 
         i--;
      }

}

Затем в JUnit вы можете передать счет по вашему выбору. Приведенный выше код является лишь одним из многих примеров, вы также можете добавить зависимость в конструктор тестируемого класса, например

public class MyClass {
   private Dependency dep;
   public MyClass(Dependency dep) {
      this.dep = dep;
   }

   public void executeCode(int iterations, Callable callable) {
       //...
       dep.callToCode(parms...);
   }
}

Опять же, в JUnit вы можете добавить другой класс, который считает количество вызовов.

Наконец, если callToCode (parms ...); это еще один метод в вашем классе, вы также можете переопределить его для подсчета, например:

public class MyClassTest {
    @Test
    public void testCountLoop() {
        MyClass class = new MyClass() {
            int calls;
            @Override
            public void callToCode(parms...) {
                calls++;
            }
        }
        // ... run and assert calls
    }
}
...