Модульный тест для метода, который вызывает другой метод другого класса - PullRequest
0 голосов
/ 18 февраля 2019

Я хочу провести модульное тестирование метода с использованием mockito, который вызывает другой метод другого класса, и этот другой метод содержит некоторую операцию с общими предпочтениями.

Это метод, который я хочу протестировать

public boolean isPersonAvailable(Context context) {
    Person person = new Person();
    return person.loadPerson(context)!= null;
}

Вот структура моего класса Person, и этот класс Person зависит от другого метода другого класса

class Person{
    public  Person loadPerson(Context context) {
        SharedPreferenceProvider sp = new SharedPreferenceProvider();
        sp.read(context,"any key");
        return new User;
    }
}

Вот структура моего класса SharedPreferenceProvider

class SharedPreferenceProvider{

       public  String read(Context context, String key) {
        SharedPreferences preference = context.getSharedPreferences("AppID", AppConstants.SAVE_MODE);
        return preference.getString(key, EMPTY_STRING);
    }

}

Как может модульное тестирование такого метода, который имеет так много зависимостей?

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

При модульном тестировании вы пытаетесь найти ошибки в изолированном коде.Однако метод isPersonAvailable состоит исключительно из взаимодействий с другими классами, такими как Context и Person.Если в этом методе есть ошибки, они будут лежать на уровне взаимодействия с этими другими классами: Вы вызываете правильный конструктор Person?Является ли возвращаемое значение null из person.loadPerson действительно показателем того, что человек недоступен, или это сигнализируется по-другому?

Вы никогда не найдете таких ошибок взаимодействия с насмешками: если у вас естьнеправильно поняв, как работают другие классы, вы будете реализовывать макеты в соответствии со своим собственным неправильным пониманием.Поэтому такой метод, как isPersonAvailable, следует тестировать с интеграционным тестированием, а не с модульным тестированием.

При этом, даже если он не имеет особого значения для этого конкретного метода, рекомендуется ознакомиться с "зависимостью".инъекция "это конечно хорошо.Вы также можете найти полезным поиск «инверсии контроля».

0 голосов
/ 18 февраля 2019

Ваша проблема здесь в том, что ваш тестируемый метод делает new Person().

В основном это влияет на вашу способность проводить разумные юнит-тесты.Вы можете обойти этот недостаток дизайна, используя PowerMock (ito) или JMockit, или улучшить свой дизайн, избегая этого вызова.Другими словами: читайте о внедрении зависимости.Поскольку это позволит вам уже иметь доступ к некоторому объекту Person.И тогда вы можете просто макетировать этот объект заранее, и его метод вернет все, что вам нужно для разумного тестирования.

Ваш тестируемый код имеет только одну зависимость,человеку объект.Избавьтесь от этого (разрешив вашему коду взаимодействовать с поддельным объектом Person), и ваша проблема исчезнет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...