추상 클래스 인스턴스 내부에있는 메서드를 테스트 할 수 없습니다. 나는 이미 여러 가지 방법을 시도해 왔으며 이것이 가능한지 알고 싶습니다. 추상 클래스의 내용은 아래 링크에서 볼 수 있습니다.mockito를 사용한 추상 익명 클래스 내에서 테스트 void 메서드
는 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이 표시했다고 모든 경고를 충당 할 수 있었다. 그러나이 경우 익명 클래스를 사용하는 대신 추상 클래스에 대한 구현을 작성해야했습니다. 다음 링크에서
업데이트 된 단위 테스트 볼 수 있듯이 :
@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);
}
}
을해야 현재 여러 테스트를 게시하지만 당신은 우리에게 추상 클래스와 테스트 할 방법을 보여 잊어 버렸습니다. 또한이 테스트 중 어느 것이이 방법을 테스트 할 예정입니까? – alfasin
@alfasin 추상 클래스는 위 링크를 통해 액세스 할 수있는 이미지로 표현됩니다. (Jacoco 클래스 리포트). 그러나 원하는 경우 수업 내용을 전체적으로 게시하여 게시물을 업데이트 할 수 있습니다. 기본적으로, 링크를 통해 사용할 수있는 이미지에서 빨간색으로 표시된 모든 것을 테스트하고 싶습니다. 특히 50 행에서 시작하여 70 행에서 끝나는 메소드입니다. 그리고이 테스트 메소드를 작성했습니다. whenConnectionLostOccurs, whenConnectCompleteOccurs 및 whenConnectCompleteOccurs whenDeliveryCompleteOccurs. – thiaguten
질문하기 전에 간단한 Mockito 자습서를 시작해야합니다. – tkruse