Подтвердить что ты не робот

Spring JUnit: как отмотать компонент с автоподстройкой в ​​компоненте с автоподстройкой

У меня есть компонент 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 другой экземпляр?

4b9b3361

Ответ 1

Вы можете предоставить новый testContext.xml, в котором вы определяете @Autowired bean, который вам нужен для вашего теста.

Ответ 2

Вы можете использовать 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");   
}

Ответ 3

Spring Загрузите 1.4, введя тестовую аннотацию под названием @MockBean. Итак, теперь насмешка и шпионаж на Spring beans поддерживается со стороны Spring Boot.

Ответ 5

Я создал сообщение в блоге по теме. Он также содержит ссылку на репозиторий Github с рабочим примером.

Трюк использует тестовую конфигурацию, где вы переопределяете оригинальный spring bean с фальшивым. Вы можете использовать аннотации @Primary и @Profile для этого трюка.