2017-12-12 2 views
-1

추상 클래스 인스턴스 내부에있는 메서드를 테스트 할 수 없습니다. 나는 이미 여러 가지 방법을 시도해 왔으며 이것이 가능한지 알고 싶습니다. 추상 클래스의 내용은 아래 링크에서 볼 수 있습니다.mockito를 사용한 추상 익명 클래스 내에서 테스트 void 메서드

Jacoco Class Report

는 belows로는 JUnit을 나는 위의 이미지의 경우를 테스트하려고 않았다 Mockito의 테스트입니다.

@RunWith(MockitoJUnitRunner.class) 
public class PahoRxMqttCallbackTest { 

    @Test 
    public void whenConnectionLostOccurs() { 
    PahoRxMqttCallback rxMqttCallback = mock(PahoRxMqttCallback.class); 
    assertThat(rxMqttCallback).isNotNull(); 

    PahoRxMqttException exception = new PahoRxMqttException(
     new MqttException(MqttException.REASON_CODE_CONNECTION_LOST)); 

    ArgumentCaptor<Throwable> onConnectionLostCauseArgumentCaptor = ArgumentCaptor.forClass(Throwable.class); 

    rxMqttCallback.connectionLost(exception); 

    verify(rxMqttCallback).connectionLost(onConnectionLostCauseArgumentCaptor.capture()); 

    assertThat(onConnectionLostCauseArgumentCaptor.getValue()).isNotNull(); 
    assertThat(onConnectionLostCauseArgumentCaptor.getValue()).isInstanceOf(PahoRxMqttException.class); 
    assertThat(onConnectionLostCauseArgumentCaptor.getValue()).hasCauseInstanceOf(MqttException.class); 
    assertThat(onConnectionLostCauseArgumentCaptor.getValue()).isEqualTo(exception); 
    } 

    @Test 
    public void whenConnectCompleteOccurs() { 
    PahoRxMqttCallback rxMqttCallback = mock(PahoRxMqttCallback.class); 
    assertThat(rxMqttCallback).isNotNull(); 

    boolean reconnect = true; 
    String brokerUri = "tcp://localhost:1883"; 

    ArgumentCaptor<Boolean> onConnectCompleteReconnectArgumentCaptor = ArgumentCaptor.forClass(Boolean.class); 
    ArgumentCaptor<String> onConnectCompleteServerUriArgumentCaptor = ArgumentCaptor.forClass(String.class); 

    rxMqttCallback.connectComplete(reconnect, brokerUri); 

    verify(rxMqttCallback).connectComplete(
     onConnectCompleteReconnectArgumentCaptor.capture(), 
     onConnectCompleteServerUriArgumentCaptor.capture()); 

    assertThat(onConnectCompleteReconnectArgumentCaptor.getValue()).isNotNull(); 
    assertThat(onConnectCompleteReconnectArgumentCaptor.getValue()).isEqualTo(reconnect); 
    assertThat(onConnectCompleteServerUriArgumentCaptor.getValue()).isNotNull(); 
    assertThat(onConnectCompleteServerUriArgumentCaptor.getValue()).isEqualTo(brokerUri); 
    } 

    @Test 
    public void whenDeliveryCompleteOccurs() { 
    PahoRxMqttCallback rxMqttCallback = mock(PahoRxMqttCallback.class); 
    assertThat(rxMqttCallback).isNotNull(); 

    IMqttDeliveryToken deliveryToken = mock(IMqttDeliveryToken.class); 
    assertThat(deliveryToken).isNotNull(); 

    RxMqttToken rxMqttToken = new PahoRxMqttToken(deliveryToken); 

    //ArgumentCaptor<IMqttDeliveryToken> onDeliveryCompleteTokenArgumentCaptor = ArgumentCaptor.forClass(IMqttDeliveryToken.class); 
    ArgumentCaptor<RxMqttToken> onDeliveryCompleteRxTokenArgumentCaptor = ArgumentCaptor.forClass(RxMqttToken.class); 

    //rxMqttCallback.deliveryComplete(deliveryToken); 
    rxMqttCallback.deliveryComplete(rxMqttToken); 

    /* 
    * Following methods *cannot* be stubbed/verified: final/private/equals()/hashCode(). 
    * Mocking methods declared on non-public parent classes is not supported. 
    */ 
    //verify(rxMqttCallback).deliveryComplete(onDeliveryCompleteTokenArgumentCaptor.capture()); 
    verify(rxMqttCallback).deliveryComplete(onDeliveryCompleteRxTokenArgumentCaptor.capture()); 

    //assertThat(onDeliveryCompleteTokenArgumentCaptor.getValue()).isNotNull(); 
    //assertThat(onDeliveryCompleteTokenArgumentCaptor.getValue()).isExactlyInstanceOf(IMqttDeliveryToken.class); 
    //assertThat(onDeliveryCompleteTokenArgumentCaptor.getValue()).isEqualTo(deliveryToken); 

    assertThat(onDeliveryCompleteRxTokenArgumentCaptor.getValue()).isNotNull(); 
    assertThat(onDeliveryCompleteRxTokenArgumentCaptor.getValue()).isExactlyInstanceOf(PahoRxMqttToken.class); 
    assertThat(onDeliveryCompleteRxTokenArgumentCaptor.getValue()).isEqualTo(rxMqttToken); 
    } 

    //@Test 
    public void whenMessageArrived() throws Exception { 
    PahoRxMqttCallback rxMqttCallback = mock(PahoRxMqttCallback.class); 
    assertThat(rxMqttCallback).isNotNull(); 

    String topic = "topic"; 
    MqttMessage message = new MqttMessage(); 

    ArgumentCaptor<String> onMessageArrivedTopicArgumentCaptor = ArgumentCaptor.forClass(String.class); 
    ArgumentCaptor<MqttMessage> onMessageArrivedMessageArgumentCaptor = ArgumentCaptor.forClass(MqttMessage.class); 

    rxMqttCallback.messageArrived(topic, message); 

    /* 
    * Following methods *cannot* be stubbed/verified: final/private/equals()/hashCode(). 
    * Mocking methods declared on non-public parent classes is not supported. 
    */ 
    verify(rxMqttCallback).messageArrived(onMessageArrivedTopicArgumentCaptor.capture(), onMessageArrivedMessageArgumentCaptor.capture()); 

    assertThat(onMessageArrivedTopicArgumentCaptor.getValue()).isNotNull(); 
    assertThat(onMessageArrivedTopicArgumentCaptor.getValue()).isEqualTo(topic); 

    assertThat(onMessageArrivedMessageArgumentCaptor.getValue()).isNotNull(); 
    assertThat(onMessageArrivedMessageArgumentCaptor.getValue()).isEqualTo(message); 
    } 

} 

웹에서 검색 한 후에도 실제로 할 수 없었습니다. 그래서 도움을 주셔서 감사합니다.

업데이트 전 테스트를 수행하고 Jacoco이 표시했다고 모든 경고를 충당 할 수 있었다. 그러나이 경우 익명 클래스를 사용하는 대신 추상 클래스에 대한 구현을 작성해야했습니다. 다음 링크에서

Jacoco Class Report 2

업데이트 된 단위 테스트 볼 수 있듯이 :

@RunWith(MockitoJUnitRunner.class) 
public class PahoRxMqttCallbackTest { 

    @Test 
    public void whenConnectionLostOccurs() { 
    PahoRxMqttCallback rxMqttCallback = spy(PahoRxMqttCallback.create(cause -> {}, (recon, uri) -> {}, t -> {})); 

    PahoRxMqttException exception = new PahoRxMqttException(
     new MqttException(MqttException.REASON_CODE_CONNECTION_LOST)); 

    ArgumentCaptor<Throwable> onConnectionLostCauseArgumentCaptor = ArgumentCaptor.forClass(Throwable.class); 

    rxMqttCallback.connectionLost(exception); 

    verify(rxMqttCallback).connectionLost(onConnectionLostCauseArgumentCaptor.capture()); 

    assertThat(onConnectionLostCauseArgumentCaptor.getValue()).isNotNull(); 
    assertThat(onConnectionLostCauseArgumentCaptor.getValue()).isInstanceOf(PahoRxMqttException.class); 
    assertThat(onConnectionLostCauseArgumentCaptor.getValue()).hasCauseInstanceOf(MqttException.class); 
    assertThat(onConnectionLostCauseArgumentCaptor.getValue()).isEqualTo(exception); 
    } 

    @Test 
    public void whenConnectCompleteOccurs() { 
    PahoRxMqttCallback rxMqttCallback = spy(PahoRxMqttCallback.create(cause -> {}, (r, u) -> {}, t -> {})); 

    boolean reconnect = true; 
    String brokerUri = "tcp://localhost:1883"; 

    ArgumentCaptor<Boolean> onConnectCompleteReconnectArgumentCaptor = ArgumentCaptor.forClass(Boolean.class); 
    ArgumentCaptor<String> onConnectCompleteServerUriArgumentCaptor = ArgumentCaptor.forClass(String.class); 

    rxMqttCallback.connectComplete(reconnect, brokerUri); 

    verify(rxMqttCallback).connectComplete(
     onConnectCompleteReconnectArgumentCaptor.capture(), 
     onConnectCompleteServerUriArgumentCaptor.capture()); 

    assertThat(onConnectCompleteReconnectArgumentCaptor.getValue()).isNotNull(); 
    assertThat(onConnectCompleteReconnectArgumentCaptor.getValue()).isEqualTo(reconnect); 
    assertThat(onConnectCompleteServerUriArgumentCaptor.getValue()).isNotNull(); 
    assertThat(onConnectCompleteServerUriArgumentCaptor.getValue()).isEqualTo(brokerUri); 
    } 

    @Test 
    public void whenDeliveryCompleteOccurs() { 
    PahoRxMqttCallback rxMqttCallback = spy(PahoRxMqttCallback.create(cause -> {}, (r, u) -> {})); 

    IMqttDeliveryToken deliveryToken = new MqttDeliveryToken(); 

    RxMqttToken rxMqttToken = new PahoRxMqttToken(deliveryToken); 

    ArgumentCaptor<IMqttDeliveryToken> onDeliveryCompleteTokenArgumentCaptor = ArgumentCaptor.forClass(IMqttDeliveryToken.class); 
    ArgumentCaptor<RxMqttToken> onDeliveryCompleteRxTokenArgumentCaptor = ArgumentCaptor.forClass(RxMqttToken.class); 

    rxMqttCallback.deliveryComplete(deliveryToken); 
    rxMqttCallback.deliveryComplete(rxMqttToken); 

    verify(rxMqttCallback).deliveryComplete(onDeliveryCompleteTokenArgumentCaptor.capture()); 
    verify(rxMqttCallback, times(2)).deliveryComplete(onDeliveryCompleteRxTokenArgumentCaptor.capture()); 

    assertThat(onDeliveryCompleteTokenArgumentCaptor.getValue()).isNotNull(); 
    assertThat(onDeliveryCompleteTokenArgumentCaptor.getValue()).isExactlyInstanceOf(MqttDeliveryToken.class); 
    assertThat(onDeliveryCompleteTokenArgumentCaptor.getValue()).isEqualTo(deliveryToken); 

    assertThat(onDeliveryCompleteRxTokenArgumentCaptor.getValue()).isNotNull(); 
    assertThat(onDeliveryCompleteRxTokenArgumentCaptor.getValue()).isExactlyInstanceOf(PahoRxMqttToken.class); 
    assertThat(onDeliveryCompleteRxTokenArgumentCaptor.getValue()).isEqualTo(rxMqttToken); 
    } 

    @Test 
    public void whenMessageArrived() throws Exception { 
    PahoRxMqttCallback rxMqttCallback = spy(PahoRxMqttCallback.create(cause -> {}, (r, u) -> {}, t -> {})); 

    String topic = "topic"; 
    MqttMessage message = new MqttMessage(); 

    ArgumentCaptor<String> onMessageArrivedTopicArgumentCaptor = ArgumentCaptor.forClass(String.class); 
    ArgumentCaptor<MqttMessage> onMessageArrivedMessageArgumentCaptor = ArgumentCaptor.forClass(MqttMessage.class); 

    rxMqttCallback.messageArrived(topic, message); 

    verify(rxMqttCallback).messageArrived(onMessageArrivedTopicArgumentCaptor.capture(), onMessageArrivedMessageArgumentCaptor.capture()); 

    assertThat(onMessageArrivedTopicArgumentCaptor.getValue()).isNotNull(); 
    assertThat(onMessageArrivedTopicArgumentCaptor.getValue()).isEqualTo(topic); 

    assertThat(onMessageArrivedMessageArgumentCaptor.getValue()).isNotNull(); 
    assertThat(onMessageArrivedMessageArgumentCaptor.getValue()).isEqualTo(message); 
    } 

} 
+1

을해야 현재 여러 테스트를 게시하지만 당신은 우리에게 추상 클래스와 테스트 할 방법을 보여 잊어 버렸습니다. 또한이 테스트 중 어느 것이이 방법을 테스트 할 예정입니까? – alfasin

+0

@alfasin 추상 클래스는 위 링크를 통해 액세스 할 수있는 이미지로 표현됩니다. (Jacoco 클래스 리포트). 그러나 원하는 경우 수업 내용을 전체적으로 게시하여 게시물을 업데이트 할 수 있습니다. 기본적으로, 링크를 통해 사용할 수있는 이미지에서 빨간색으로 표시된 모든 것을 테스트하고 싶습니다. 특히 50 행에서 시작하여 70 행에서 끝나는 메소드입니다. 그리고이 테스트 메소드를 작성했습니다. whenConnectionLostOccurs, whenConnectCompleteOccurs 및 whenConnectCompleteOccurs whenDeliveryCompleteOccurs. – thiaguten

+0

질문하기 전에 간단한 Mockito 자습서를 시작해야합니다. – tkruse

답변

0

당신은 클래스의 인스턴스를 결코를, 단지 클래스의 조롱.

PahoRxMqttCallback rxMqttCallback = mock(PahoRxMqttCallback.class); 

실물 크기의 모의 광고는 가짜 사본이 아닙니다.

대신 당신이

PahoRxMqttCallback rxMqttCallback = new PahoRxMqttCallback(); 

또는

PahoRxMqttCallback rxMqttCallback = spy(new PahoRxMqttCallback()); 
+0

실제 객체를 사용해 보았지만 Mockito의 검증 메소드가 그것에 대해 불평했습니다 (org.mockito.exceptions.misusing.NotAMockException : verify()에 전달 된 인수가 모의 객체가 아닙니다). 이제 spy() 메서드를 대신 사용해보십시오. 이 방법을 사용하면 테스트가 실행되었지만 Jacocko는 Mockito의 모의 메서드를 사용했을 때와 같은 경고를 사용하여 보고서를 생성했습니다. 당신의 대답은 잘못이 아니지만, 제 문제를 해결하기 위해해야 ​​할 완벽한 해결책은 아니 었습니다. – thiaguten

관련 문제