Мокинг метода publi c внутри частного метода - PullRequest
0 голосов
/ 13 июля 2020

У меня есть класс, как показано ниже:

public class ClassOne {

    public function1(input, output, context) {
        //some implementation

        private function2(List, String, String);
    } 
    
    private void function2(List, String, String){
        Class2 class2 = new Class2();
        String value = class2.method1(string, string);
    }
}

public Class2 {
    public String method2(string, string) {
        //some implementation
        return string;
    }
}

Я пишу модульный тест для ClassOne, используя Mockito и PowerMockito, и хотел бы имитировать вызов class2 и не хочу фактически вызывать тело метода для method2 . Как я могу этого добиться?

Я пробовал Mockito.mock и PowerMockito.spy класс и when(class2.method2).thenReturn() и doReturn().when(class2).method2();, но все вызывает тело метода, когда я делаю classOne.function1. Я шпионил за ClassOne.

1 Ответ

1 голос
/ 13 июля 2020

Было бы очень полезно, если бы вы также предоставили свои неработающие модульные тесты. С другой стороны, я почти уверен, что проблемы все равно нет :)

Ваша проблема не в том, что Mockito и PowerMockito не работают. Настоящая проблема заключается в зависимости ваших классов. Или, чтобы быть более конкретным, c способ, которым ваши классы обрабатывают эту зависимость.

В общем, создание экземпляра зависимости (Class2) в том месте, где это необходимо (ClassOne), не является хорошей идеей. . Как видите, это усложняет тестирование. Было бы лучше передать зависимость в класс, который в ней нуждается. Это называется Внедрение зависимостей (DI).

В вашем примере вы должны передать объект Class2 в конструктор ClassOne. Код будет выглядеть примерно так:

public class ClassOne {

    private final Class2 class2;

    public ClassOne(Class2 class2) {
        this.class2 = class2;
    }

    ...
    
    private void function2(List, String, String){
        String value = class2.method1(string, string);
    }
}

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

В вашем модуле Протестируйте: теперь вы можете передать имитацию Class2 в свой Class1 объект, который затем будет использоваться.

...