Как протестировать приватный Injected обьект?

324
01 февраля 2018, 18:02

Как протестировать приватный Injected обьект?

Есть код:

public class MyClass {
    @Inject
    private SecondClass secondClass;
    public boolean isInProgres() {
        if (secondClass.isTaskInProgress()) {
            return true;
        }
        return false;
    }
}

В тестах я хочу сделать что-то типа:

when(secondClass).doReturn(true);
assertThat(MyClass.isInProgres(), equalTo(true));

Но если бы secondClass передовался в конструктор, то я бы мог переопределить поведение метода обьекта, который я передаю.

А так в тестах создал обьект MyClass и он инжектит не понятно что и не проверить тестами работу.

Answer 1
  1. Лучше всего избавится от этой привычки делать инъекцию приватным полям. Лучший способ это впихнуть инъекцию через конструктор, тогда у вас не будет никаких проблем в тестах:

    @Inject
    public MyClass(SecondClass secondClass) { *** }
  2. Вариация прошлого - через сеттер. Но это если не стремитесь к иммутабельности:

    @Inject
    public void setSecondClass(SecondClass secondClass) { *** }
  3. Чуть большее зло - это тестирование с использованием SpringJUnit4ClassRunner. Тогда мы объявляем контекст:

    @Configuration
    class TestContext {
        @Bean
        public void SecondClass secondClassProvider() { Mockito.mock(... }
    }
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(classes = TestContext.class)
    public class Test {
        @Inject
        MyClass myClass;
    }
  4. Самое большое зло - это рефлексия:

    ReflectionTestUtils.setField("secondClass", ...)
READ ALSO
JOIN на уровне базы данных или на уровне приложения?

JOIN на уровне базы данных или на уровне приложения?

Имется две таблицы: Судья и СоревнованиеОдно соревнование судят несколько судей, один и тот же судья может судить несколько соревнований

245
Как устроена иерархия классов и методов

Как устроена иерархия классов и методов

Учу ООП java, возник вопрос

246
Python не дружит с Java

Python не дружит с Java

В NetBeans IDE создана форма проекта с одной кнопкой , которая в обработчике событий имеет код на выполнение скрипта , который написан на PythonСкрипт...

297
Выбор значений из ArrayList согласно ключу HashMap

Выбор значений из ArrayList согласно ключу HashMap

Помогите пожалуйста в следующей проблемеУ меня есть список ArrayList, и связанная с ним карта HashMap

187