Как протестировать приватный 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 и он инжектит не понятно что и не проверить тестами работу.
Лучше всего избавится от этой привычки делать инъекцию приватным полям. Лучший способ это впихнуть инъекцию через конструктор, тогда у вас не будет никаких проблем в тестах:
@Inject
public MyClass(SecondClass secondClass) { *** }
Вариация прошлого - через сеттер. Но это если не стремитесь к иммутабельности:
@Inject
public void setSecondClass(SecondClass secondClass) { *** }
Чуть большее зло - это тестирование с использованием SpringJUnit4ClassRunner. Тогда мы объявляем контекст:
@Configuration
class TestContext {
@Bean
public void SecondClass secondClassProvider() { Mockito.mock(... }
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = TestContext.class)
public class Test {
@Inject
MyClass myClass;
}
Самое большое зло - это рефлексия:
ReflectionTestUtils.setField("secondClass", ...)
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости