#java #юнит_тесты #junit
В общем есть следующий код, состоящий из синглтона и класса, использующего его (упрощенная версия). public final class Singleton { private static Singleton s_instance = new Singleton(); public static Singleton getInstance(){ return s_instance; } public String getString(){ return "string"; } public String getStringTest(){ return "string_test"; } } public class SomeClass{ private String someString; public SomeClass(){ someString = Singleton.getInstance().getString(); } } Синглтон считывает конфигурацию из файла и предоставляет методы для ее получения компонентами программы (getString() и т.п.). Для тестирования работы класса SomeClass мне нужно, чтобы он получил другое значение при вызове getString(), а именно то, которое вернет getStringTest(). Я хотел бы иметь что-то типа такого, но столкнулся с тем, что не знаю, как создать mock или spy объект для синглтона: when(Singleton.getInstance().getString()).thenReturn(Singleton.getInstance().getStringlTest()); Ну и как следствие вопрос: Как можно создать mock или spy объект для синглтона или как по-другому можно подменить возвращаемое синглтоном значение? Java, jUnit4.
Ответы
Ответ 1
Mockito, мне кажется, прекрасно справится с Вашей задачей. Singleton singleton = mock(Singleton.class); when(singleton.getStringTest()).thenReturn("What you need");Ответ 2
Приведу самый эффективный, пусть и не очень красивый (и очень непопулярный) вариант тестирования Singleton. Шаг 1. Добавьте метод Singleton.setInstance и сделайте конструктор Singleton защищенным: public final class Singleton { private static Singleton s_instance = new Singleton(); public static setInstance(Singleton instance) { s_instance = instance; } // ... } Шаг 2. Мокните класс Singleton любым способом и задайте полученный объект через Singleton.setInstace Шаг 3. Протестируйте класс SomeClass. А когда у вас появится время для выплаты технического долга, выполните еще один шаг: Шаг 4. Проведите рефакториг класса SomeClass, выкинув любое использование метода Singleton.getInstance. Инжектируйте экземпляр Singleton в SomeClass в явном виде.
Комментариев нет:
Отправить комментарий