Можно ли переопределить bean-компонент, созданный с помощью аннотации @FeignClient
, просто создав bean-компонент @Configuration
, который содержит его фиктивную версию для тестирования?
Я уже пробовал это, но кажется, что bean-компонент @FeignClient
создается последним (по крайней мере, я так думаю), так как в моем тесте я всегда ввожу реальную версию, а не издевательскую. В том же конфигурационном файле у меня есть другой bean-компонент, созданный без каких-либо аннотаций (кроме @Component
), который издевался таким же образом, просто используя имя настоящего, и он отлично работает.
Я пытался использовать @MockBean
, чтобы издеваться над ним, и это работает, но у проекта есть некоторые причуды, из-за которых создание другого контекста Spring нарушает тесты.
Спасибо.
РЕДАКТИРОВАТЬ. На самом деле, я только что отладил тест и понял, что если я использую то же имя, что и клиент Feign, отладчик даже не остановится в bean-компоненте @Configuration
для создания фиктивной версии. Изменение имени на что-то другое работает, но оно просто создает другой компонент того же типа с новым именем. Есть ли какая-либо конфигурация, которую мне здесь не хватает?
РЕДАКТИРОВАТЬ 2. Это пример кода. Выполняя это, я получаю, что BarService
— это издевательская версия, а FooService
— настоящая.
@FeignClient(name = "fooService")
public interface FooService {
}
@Component
public class BarService {
}
@Configuration
public class ConfigClass {
@Bean
public FooService fooService() {
return Mockito.mock(FooService.class);
}
@Bean
public BarService barService() {
return Mockito.mock(BarService.class);
}
@RunWith(SpringRunner.class)
@ActiveProfiles("test")
@SpringBootTest
public class TestClass {
@Autowired
private FooService fooService;
@Autowired
private BarService barService;
@Test
public void test() {
System.out.println(fooService.getClass());
}
}
@MockBean
. Я предполагаю, что он создает только один дополнительный контекст для хранения макетов bean-компонентов и что он не создает новые каждый раз, когда тест определяет макет, который еще не был создан. Так ли это? Поскольку создание контекста фактически влияет на время, необходимое для запуска тестов, поскольку Hibernate был запущен с использованием сценариев sql, которые использует приложение. - person Juan Vega   schedule 30.05.2017@MockBean
создает макет для bean-компонента и более тесно интегрируется с контекстом, автоматически сбрасывает макеты и т. д. - person M. Deinum   schedule 30.05.2017