2016-06-28 4 views
-5

저는 java, unit-testing 및 mockito를 처음 사용하지만 클래스에서 무언가를 테스트하고 싶습니다. 내가 테스트 할Mockito 테스트 덮어 쓰는 void 메서드

등급 :

abstract class Irc { 
    Command received(String data) { 
     // parsing 

     receivedCommand(prefix, command, parameters, trailing, tags); 

     return new Command(prefix, command, parameters, trailing, tags); 
    } 

    private void receivedCommand(String prefix, String command, String[] parameters, String trailing, Map<String, String> tags) { 
     String nick = getNickFromPrefix(prefix); 

     parsed(prefix, command, parameters, trailing); 

     if (command.equals("MODE")) { 
      if (parameters.length == 3) { 
       String chan = parameters[0]; 
       String mode = parameters[1]; 
       String name = parameters[2]; 

       if (mode.length() == 2) { 
        String modeChar = mode.substring(1, 2); 
        if (mode.startsWith("+")) { 
         onModeChange(chan, name, true, modeChar, prefix); 
        } else if (mode.startsWith("-")) { 
         onModeChange(chan, name, false, modeChar, prefix); 
        } 
       } 
      } 

      return; 
     } 
    } 

    void onModeChange(String channel, String nick, boolean modeAdded, String mode, String prefix) { 
    } 
} 

편집 : 나는 received가 호출 된 후 onModeChange가 호출되어 있는지 확인하려면 .

지금까지이 내용 : when가 작동하지만 verifyActually, there were zero interactions with this mock.

+1

어쩌면 당신이 게시물 https://stackoverflow.com/questions/1087339/using-mockito-to-test-abstract-classes에 보일 것입니다 – Piotr0123456

+0

나는 몇 가지 문제가 있었다 formating, 나는 나의 포스트를 새롭게했다. – SUNflOw1991

+0

왜 내가 -5 표를 얻었습니까? 내가 뭔가 잘못 됐니? – SUNflOw1991

답변

2

귀하의 코드는 모든 비즈니스 메소드를 호출하지 않습니다 실패

@Test 
public void modeChangeReceivedRightSyntax() { 
    try { 
     irc = new Irc("Test") { 
      @Override 
      public void debug(String line) { 
       System.err.println(line); 
      } 

      @Override 
      void onModeChange(String channel, String nick, boolean modeAdded, String mode, String prefix) { 
       System.out.println("Mode Change: " + channel + " " + nick + " " + mode + " " + prefix + " " + modeAdded); 
      } 
     }; 

     ircMock = spy(irc); 

     when(
       ircMock.received(":jtv MODE #channel +o user") 
     ).thenReturn(
       new Command("jtv", "MODE", new String[]{"#channel", "+o", "user"}, "", null) 
     ); 

     verify(ircMock).onModeChange("#channel", "user", true, "o", "jtv"); 
    } catch (Exception ex) { 
     fail("Exception: " + ex.toString()); 
    } 
} 

. 그것은 수신 된 메소드가 어떻게 작동해야하는지 모의 만하지만 실제로 메소드를 호출하지는 않습니다. Irc 클래스는 추상 클래스이므로 스파이를 사용하는 방법은 좋지만 수신 된 메소드를 조롱하지 말고 스파이에게 실제 메소드를 위임하도록 지시해야합니다. 그런 다음 onModeChange가 호출되는지 확인할 수 있습니다. 당신은 추상 클래스를 테스트하려면

Irc irc = spy(Irc.class, withSettings().defaultAnswer(CALLS_REAL_METHODS)); 

// Business method 
irc.received(":jtv MODE #channel +o user"); 

// Asserts 
verify(irc).onModeChange("#channel", "user", true, "o", "jtv"); 
+0

'Irc irc = mock (Irc.class, CALLS_REAL_METHODS);와 작동합니다. 고마워요! – SUNflOw1991