Уже два дня пытаюсь решить следующую проблему. Есть приложение на Spring Boot, в нем есть два конвертера, один из которых вызывает другой при необходимости.
Выглядит это так для одного конвертора
// Include goes here
@Service
public class Conv1 implements Converter<Class1, Class2> {
@Override
public Class2 convert(Class1 source) {
//...
}
}
// Include goes here
@Service
public class Conv2 implements Converter<BigClass1, BigClass2> {
@Autowired
ConversionService converter;
@Override
public BigClass2 convert(BigClass1 source) {
//...
result.setClass2Property(converter.convert(source.getClass1Property()));
//...
}
}
При попытке прогнать эти классы через юнит-тест вываливается NullPointerException на второй конвертер на моменте вызова первого, при этом объявленный через тот же @Autowired ConversionService в самом юнит-тесте разрешается нормально. Тест выглядит подобным образом
// Imports
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = TestConfig.class, loader = SpringApplicationContextLoader.class)
public class Conv2Test {
@Autowired
ConversionService converter;
@Test
public void testConv2() {
BigClass1 source = new BigClass1(...);
BigClass2 target = converter.convert(source, BigClass2.class);
}
}
В конфиге конверторы регистрируются так
@Bean(name = "conversionService")
public ConversionService getConversionService() {
ConversionServiceFactoryBean bean = new ConversionServiceFactoryBean();
bean.setConverters(getConverters()); // Возвращает Set<Converter>
bean.afterPropertiesSet();
ConversionService object = bean.getObject();
return object;
}
Успел найти что Autowired происходит после создания объекта, но объекты-конверторы создаются в getConverters() в конфиге, и судя по тому что в самом юнит-тесте оно работает - они создаются корректно.
Кто-нибудь сталкивался?
upd: проверил ApplicationContext из конвертора, conversionService там есть и с ним все в порядке. Но Autowire упорно выдает null без всяких дополнительных ошибок
Upd2: кое-как заткнул костылями, тесты ок, зато на старте оно не только находит conversionService, но находит аж 2 разных. Чую я криво инициализирую контекст. Кто-нибудь может ткнуть в пример как он инициализируется для java конфига для тестов?