是否可以通过仅创建一个包含用于测试的模拟版本的bean 来覆盖通过@FeignClient
注释创建的bean?@Configuration
我已经尝试过了,但似乎@FeignClient
bean 是最后创建的(或者我认为),因为在我的测试中,我总是注入真实版本而不是模拟版本。在同一个配置文件中,我创建了另一个没有任何注释(除了@Component
)的 bean,仅使用真实的名称以相同的方式模拟,并且它运行良好。
我尝试过使用@MockBean
它来模拟它并且它可以工作,但是该项目有一些怪癖,这使得创建另一个 Spring 上下文会破坏测试。
谢谢。
编辑。实际上,我只是调试了测试并意识到,如果我使用与 Feign 客户端相同的名称,调试器甚至不会停止在@Configuration
bean 中创建模拟版本。将名称更改为它可以工作的其他名称,但它只是使用新名称创建另一个相同类型的 bean。我在这里缺少任何配置吗?
编辑 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());
}
}