Использование метода суперкласса Mockito test - PullRequest
1 голос
/ 06 января 2012

    class Sup {
          public void someMethod(){
              // do something
          }
    }


    class Sub extends Sup {
            public void method(Object obj) {
                  if (obj == null) {
                      super.someMethod();
                      return;
                  }

                 // do something
            }
    }


    class SubTest {

        @Test
        public void testMethodArgIsNull() {
                 Sub s = new Sub();
                 Sub spyS = spy(s);

                 spyS.method(null);

                 //test case fails
                 verify(spyS).someMethod();

         }
    }

если я переопределю метод "method" в Sub как, вместо вызова super.someMethod (), если я вызову someMethod (), тестовый пример пройден.Но я не хочу вносить какие-либо изменения в код.помогите мне проверить код ..

1 Ответ

3 голосов
/ 06 января 2012

Я не знаю, почему вы хотите избежать изменения кода, но у вас могут быть свои причины. Вы не можете просто проверить, что супер-метод был вызван для шпиона. Тем не менее, вы все еще можете протестировать этот метод без изменения кода. Единственный способ сделать это - без шпиона. Другими словами, вам нужно будет проверить функциональность someMethod с утверждениями или проверками на других издевательствах. Например, если класс Sup реализован тривиально, то:

class Sup {
      private boolean somethingDone = false;
      public boolean isSomethingDone() {
          return somethingDone;
      }

      public void someMethod(){
          somethingDone = true;
      }
}

Тогда вы можете написать свой тестовый пример так:

@Test
public void testMethodArgIsNull() {
    Sub s = new Sub();
    s.method(null);
    assertThat(s.isSomethingDone(), is(true));
}

Это, как говорится, вызов super.someMethod() из чего-либо, кроме Sub.someMethod() (которого не существует), выглядит как ошибка, ожидающая, чтобы произойти. Если Sub.someMethod() не существует, то super.someMethod() эквивалентно someMethod(). Но если бы кто-то переопределил его в будущем, вы бы действительно хотели, чтобы method(Object o) незаметно обошел его и в любом случае вызвал супер реализацию?

Позвонив по номеру super.someMethod(), вы не получите ничего, кроме риска будущих ошибок.

...