Ответ 1
Вы можете предоставить новый testContext.xml, в котором вы определяете @Autowired
bean, который вам нужен для вашего теста.
У меня есть компонент Spring, который я бы хотел протестировать, и этот компонент имеет атрибут autwired, который мне нужно изменить для модульного тестирования. Проблема заключается в том, что класс использует автоупрочненный компонент внутри метода post-construct, поэтому я не могу его заменить (то есть через ReflectionTestUtils) до его фактического использования.
Как мне это сделать?
Это класс, который я хочу проверить:
@Component
public final class TestedClass{
@Autowired
private Resource resource;
@PostConstruct
private void init(){
//I need this to return different result
resource.getSomething();
}
}
И это основа тестового примера:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations= "classpath:applicationContext.xml")
public class TestedClassTest{
@Autowired
private TestedClass instance;
@Before
private void setUp(){
//this doesn't work because it executed after the bean is instantiated
ReflectionTestUtils.setField(instance, "resource", new Resource("something"));
}
}
Есть ли способ заменить ресурс чем-то еще до вызова метода postconstruct? Как рассказать Spring JUnit runner, чтобы autowire другой экземпляр?
Вы можете предоставить новый testContext.xml, в котором вы определяете @Autowired
bean, который вам нужен для вашего теста.
Вы можете использовать Mockito. Я не уверен с PostConstruct
в частности, но это обычно работает:
// Create a mock of Resource to change its behaviour for testing
@Mock
private Resource resource;
// Testing instance, mocked `resource` should be injected here
@InjectMocks
@Resource
private TestedClass testedClass;
@Before
public void setUp() throws Exception {
// Initialize mocks created above
MockitoAnnotations.initMocks(this);
// Change behaviour of `resource`
when(resource.getSomething()).thenReturn("Foo");
}
Spring Загрузите 1.4, введя тестовую аннотацию под названием @MockBean
. Итак, теперь насмешка и шпионаж на Spring beans поддерживается со стороны Spring Boot.
Вы можете переопределить определения bean с помощью mocks с помощью spring -reinject https://github.com/sgri/spring-reinject/
Я создал сообщение в блоге по теме. Он также содержит ссылку на репозиторий Github с рабочим примером.
Трюк использует тестовую конфигурацию, где вы переопределяете оригинальный spring bean с фальшивым. Вы можете использовать аннотации @Primary
и @Profile
для этого трюка.