Тестирование абстрактного класса с помощью Mockito не дает ожидаемого результата - PullRequest
0 голосов
/ 02 марта 2020

У меня есть структура класса, подобная следующей

 public abstract class AbstractStep {
     private final Range RANGE;

     AbstractStep(AbstractStepBuilder builder) {
          RANGE = builder.range;   
     }


      public abstract static class AbstractStepBuilder {
           Range range;

           public AbstractStepBuilder setRange(int start, end end) {
                this.range = new Range(start, end);
                return self();
           }

           abstract AbstractStepBuilder self();
      }

      public static class Range() {
           private final int START;
           private final int END;

           private Range(int start, int end) {
                if(start < 0 || end < 0 || start >= end)
                      throw new IllegalArgumentException();
                START = start;
                END = end;
           }
      }
 }

Я хочу проверить setRange(int, int) в AbstractStepBuilder, чтобы увидеть, выбрасывается ли IllegalArgumentException. Я использую TestNG и Mockito, и я попытался выполнить следующее с помощью this .

 final class RangeTest {
      AbstractStepBuilder builder;

      @BeforeSuite 
      void setup() {
           builder = Mockito.mock(AbstractStepBuilder.class);
           Mockito.when(builder.self()).thenReturn(null);
       }

     @Test(expectedExceptions = IllegalArgumentException.class)
     final void testCreatingRangeWithNegativeStart() {
          builder.setRange(-1, 2);
     }
}

Этот тест не пройден. Я также попытался заменить Mockito.mock(AbstractStepBuilder.class) на Mockito.mock(AbstractStepBuilder.class, Mockito.CALLS_REAL_METHODS), как в верхнем ответе на этот вопрос.

Обратите внимание, что если я сделаю CodeRange в качестве своего внешнего класса, этот тест пройден , поэтому я не верю, что это может быть сам тест.

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

1 Ответ

2 голосов
/ 02 марта 2020

Вы вызываете метод на макете, который никогда не сгенерирует исключение, пока вы не скажете это. Вы никогда не издеваетесь над классом, который хотите протестировать.

Если вы хотите протестировать реальный класс, вам нужно создать подкласс построителя шагов, создать экземпляр и протестировать его.

Я думаю, что вы также можете создать шпиона (Mockito.spy(AbstractStepBuilder.class)), чтобы избежать создания подкласса только для теста.

...