Как получить возвращаемый объект с помощью mockito framework - PullRequest
0 голосов
/ 01 ноября 2019

Новое в инфраструктуре Mockito.

 RcExtensionInfo rcExtensionInfo = rcApiClient.get(
                RC_OFFICE_EXTENSION_INFO_API_PATH,
                pathVariablesForExtensionInfoRequest,
                customRequestHeaders,
                RcApplicationHeadersService.RcApplicationType.OFFICE_INTEGRATION,
                RcExtensionInfo.class
        );

Приведенный выше код мне нужно протестировать с помощью mockito, и я хочу реальный объект RcExtensionInfo, потому что этот объект используется в моем коде для нескольких методов получения. В настоящее время невозможно вызвать метод получения из-за null. Поскольку мы знаем, что если мы будем издеваться над каким-либо методом, то значением по умолчанию будет null. Но я думаю, что мы можем присвоить объект из метода thenReturn этой ссылке.

Тестовый код:

RcAccountInfo rcAccountInfo = new RcAccountInfo();
    rcAccountInfo.setMainNumber("+198473621");
    when(rcApiClient.get(RC_OFFICE_ACCOUNT_INFO_API_PATH,
            new HashMap<String, String>(), new HashMap<String, String>(),
            RcApplicationHeadersService.RcApplicationType.OFFICE_INTEGRATION,
            RcAccountInfo.class)).thenReturn(rcAccountInfo);

Полный тестовый класс:

@RunWith(MockitoJUnitRunner.class)
public class SIPServiceTest {

private static final String RC_OFFICE_EXTENSION_INFO_API_PATH = "/account/{RCAccountId}/extension/{RCExtensionId}";
private static final String RC_OFFICE_ACCOUNT_INFO_API_PATH = "/account/{RCAccountId}";

@Mock
private JwtService jwtService;

@Mock
private EvApiClient cfApiClient;

@Mock//(answer = Answers.RETURNS_DEEP_STUBS)
private RcApiClient rcApiClient;

@InjectMocks
private SIPService sipService;

@Mock
private Claims claims;

@Test
public void testMainNumAndExtNumber() throws ServiceException, URISyntaxException {

    //Given
    when(claims.get(JwtUtils.ClaimKeys.IS_SSO_LOGIN, Boolean.class)).thenReturn(true);
    when(claims.get(JwtUtils.ClaimKeys.RING_CENTRAL_ACCOUNT_ID, String.class)).thenReturn("+198473621");
    when(String.valueOf(claims.get(JwtUtils.ClaimKeys.RING_CENTRAL_USER_ID, Long.class))).thenReturn("102");

    RcAccountInfo rcAccountInfo = new RcAccountInfo();
    rcAccountInfo.setMainNumber("+198473621");
    when(rcApiClient.get(RC_OFFICE_ACCOUNT_INFO_API_PATH,
            new HashMap<String, String>(), new HashMap<String, String>(),
            RcApplicationHeadersService.RcApplicationType.OFFICE_INTEGRATION,
            RcAccountInfo.class)).thenReturn(rcAccountInfo);

    RcExtensionInfo rcExtensionInfo = mock(RcExtensionInfo.class);
    doReturn(rcExtensionInfo).when(rcApiClient).get(RC_OFFICE_EXTENSION_INFO_API_PATH,
            new HashMap<String, String>(), new HashMap<String, String>(),
            RcApplicationHeadersService.RcApplicationType.OFFICE_INTEGRATION,
            RcExtensionInfo.class);

    when(sipService.getMainNumberAndExtensionNumber(claims))
            .thenReturn(new RcOfficeMainAndExtensionNumber());
    //Then
    //verify(sipService).getMainNumberAndExtensionNumber(any());
    //assertEquals("123", "123");
}

}

Вышеуказанные 3 when работают отлично.

Метод проверки:

public RcOfficeMainAndExtensionNumber getMainNumberAndExtensionNumber(Claims claims) throws ServiceException, URISyntaxException{
    if (claims == null) {
        throw new ServiceException(ErrorCode.ACCESS_DENIED, "Cannot authenticate without valid claims");
    }
    RcOfficeMainAndExtensionNumber rcOfficeMainAndExtensionNumber = new RcOfficeMainAndExtensionNumber();
    Boolean isSSOLogin = claims.get(JwtUtils.ClaimKeys.IS_SSO_LOGIN, Boolean.class);

    if(isSSOLogin != null && isSSOLogin) {
        String rcAccountId = claims.get(JwtUtils.ClaimKeys.RING_CENTRAL_ACCOUNT_ID, String.class);
        String rcExtensionId = String.valueOf(claims.get(JwtUtils.ClaimKeys.RING_CENTRAL_USER_ID, Long.class));

        Map<String, String> customRequestHeaders = new HashMap<>();
        customRequestHeaders.put(RC_ACCOUNT_ID, rcAccountId);
        customRequestHeaders.put(RC_EXTENSION_ID, rcExtensionId);

        Map<String, String> pathVariablesForAccountInfoRequest = new HashMap<>();
        pathVariablesForAccountInfoRequest.put(RC_ACCOUNT_ID, rcAccountId);

        RcAccountInfo rcAccountInfo = rcApiClient.get(
                RC_OFFICE_ACCOUNT_INFO_API_PATH,
                pathVariablesForAccountInfoRequest,
                customRequestHeaders,
                RcApplicationHeadersService.RcApplicationType.OFFICE_INTEGRATION,
                RcAccountInfo.class
        );

        Map<String, String> pathVariablesForExtensionInfoRequest = new HashMap<>();
        pathVariablesForExtensionInfoRequest.put(RC_ACCOUNT_ID, rcAccountId);
        pathVariablesForExtensionInfoRequest.put(RC_EXTENSION_ID, rcExtensionId);

        RcExtensionInfo rcExtensionInfo = rcApiClient.get(
                RC_OFFICE_EXTENSION_INFO_API_PATH,
                pathVariablesForExtensionInfoRequest,
                customRequestHeaders,
                RcApplicationHeadersService.RcApplicationType.OFFICE_INTEGRATION,
                RcExtensionInfo.class
        );

        rcExtensionInfo.getExtensionNumber();

        rcOfficeMainAndExtensionNumber.setMainNumber(rcAccountInfo.getMainNumber());
        rcOfficeMainAndExtensionNumber.setExtensionNumber(rcExtensionInfo.getExtensionNumber());
    }
    return  rcOfficeMainAndExtensionNumber;
}

Ответы [ 2 ]

0 голосов
/ 01 ноября 2019

Проблема в вашем 4-м when состоит в том, что вы используете объекты, которые будут другими в вашем тесте. Потому что new HashMap<String, String>() в when и new HashMap<String, String>() в тесте не равны объектам. Таким образом, ваш when никогда не будет звонить. Вы должны использовать что-то вроде этого:

when(rcApiClient.get(RC_OFFICE_ACCOUNT_INFO_API_PATH,
        Mockito.anyMap(), Mockito.anyMap(),
        RcApplicationHeadersService.RcApplicationType.OFFICE_INTEGRATION,
        RcAccountInfo.class)).thenReturn(rcAccountInfo);
0 голосов
/ 01 ноября 2019

Вы можете вызвать Mockito.mock(YourClass.class, Mockito.CALLS_REAL_METHODS), чтобы сделать так, чтобы, если when(..).then(...) не настроил ничего другого, действительные методы вызывались для максируемых объектов.

...