Как мне издеваться над устаревшим объектом в этом коде ниже? - PullRequest
0 голосов
/ 09 января 2019

Я писал модульные тесты, используя mockito framework. У меня есть этот устаревший код ниже, как я могу издеваться над клиентским объектом RemoteService в методе Approvection без его рефакторинга?

public Map<String, String> approvalAction(long documentId, ActionCommandDTO request, FormData formData, byte[] prevData) {

    RemoteService client = getRemoteService();
    String urlString = String.format("formExtensions/%s?%s", formData.getId(), getAuthParam(formData.getRealm()));
    try {
        response = client.postEntity(urlString, String.class, approvalSvcRequestStr);
    } catch (Exception e) {
        // TODO: handle rollback properly for P2P
        handleApprovalActionFailed(documentId, request, formData, prevData);
    }

    return map;
}


private RemoteService getRemoteService() {

    RemoteServiceConfig remoteServiceConfig = (RemoteServiceConfig) this.serviceConfigRegistry.getServiceConfigs().get("approval");
    remoteServiceConfig.setClientID(clientId);
    remoteServiceConfig.setClientSecret(privateSecret);
    RemoteService remoteService = new RemoteService(remoteServiceConfig, authorizationHeaderServiceImpl);

    return remoteService;
}

Ответы [ 3 ]

0 голосов
/ 09 января 2019

Вы не можете издеваться над RemoteService, потому что он создается внутри вашего класса. Если возможно, извлеките getRemoteService в другой класс, назовите его NewClass. Теперь вы можете издеваться над NewClass.

public Map<String, String> approvalAction(long documentId, ActionCommandDTO request, FormData formData, byte[] prevData) {

    RemoteService client = NewClass.getRemoteService(params);
    ///
}

Другой способ, если вы не хотите сильно менять свой унаследованный код, - это расширить функцию переопределения класса (которая реализует одобрение) функции getRemoteService (). В новой реализации вызова getRemoteService создайте макет RemoteService. Вы можете проверить этот новый класс.

0 голосов
/ 09 января 2019

Почему бы не сделать RemoteService инъекционным через конструктор, но также разрешить конструктор по умолчанию?

class YourClass{

    private final RemoteService client;

    public YourClass(RemoteService client){
        this.client = client;
    }

    public YourClass(){
        RemoteServiceConfig remoteServiceConfig = (RemoteServiceConfig) this.serviceConfigRegistry.getServiceConfigs().get("approval");
        remoteServiceConfig.setClientID(clientId);
        remoteServiceConfig.setClientSecret(privateSecret);
        client = new RemoteService(remoteServiceConfig, authorizationHeaderServiceImpl);
    }

    // all of your other methods inside the class

}

Конечно, вам придется адаптировать уже существующие конструкторы. но так как вы не показали весь класс, это невозможно для меня.

Это оставляет вам один экземпляр клиента на протяжении всего срока службы YourClass.


Теперь очень легко издеваться над RemoteService. Просто создайте экземпляр YourClass с клиентом:

RemoteService mock = mock(RemoteService.class);
YourClass toTest = new YourClass(mock);
0 голосов
/ 09 января 2019

измените getRemoteService на protected и используйте подкласс для его переопределения:

public class SomeService {

    public Map<String, String> approvalAction(long documentId, ActionCommandDTO request, FormData formData, byte[] prevData) {

    }


    // change here
    protected RemoteService getRemoteService() {

        RemoteServiceConfig remoteServiceConfig = (RemoteServiceConfig) this.serviceConfigRegistry.getServiceConfigs()
                .get("approval");
        remoteServiceConfig.setClientID(clientId);
        remoteServiceConfig.setClientSecret(privateSecret);
        RemoteService remoteService = new RemoteService(remoteServiceConfig, authorizationHeaderServiceImpl);

        return remoteService;
    }

}


public class TestSomeService extends SomeService {


    @Override
    protected RemoteService getRemoteService() {
        return new MockService();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...