相关疑难解决方法(0)

在Integration测试中覆盖bean

对于我的Spring-Boot应用程序,我通过@Configuration文件提供了RestTemplate,因此我可以添加合理的默认值(ex Timeouts).对于我的集成测试,我想模拟RestTemplate,因为我不想连接到外部服务 - 我知道期望的响应.我尝试在集成测试包中提供不同的实现,希望后者将覆盖实际的实现,但是反过来检查日志:真正的实现覆盖了测试.

如何确保TestConfig中的那个是使用的?

这是我的配置文件:

@Configuration
public class RestTemplateProvider {

    private static final int DEFAULT_SERVICE_TIMEOUT = 5_000;

    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate(buildClientConfigurationFactory());
    }

    private ClientHttpRequestFactory buildClientConfigurationFactory() {
        HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
        factory.setReadTimeout(DEFAULT_SERVICE_TIMEOUT);
        factory.setConnectTimeout(DEFAULT_SERVICE_TIMEOUT);
        return factory;
    }
}
Run Code Online (Sandbox Code Playgroud)

整合测试:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = TestConfiguration.class)
@WebAppConfiguration
@ActiveProfiles("it")
public abstract class IntegrationTest {}
Run Code Online (Sandbox Code Playgroud)

TestConfiguration类:

@Configuration
@Import({Application.class, MockRestTemplateConfiguration.class})
public class TestConfiguration {}
Run Code Online (Sandbox Code Playgroud)

最后是MockRestTemplateConfiguration

@Configuration
public class MockRestTemplateConfiguration {

    @Bean
    public RestTemplate restTemplate() {
        return Mockito.mock(RestTemplate.class)
    }
}
Run Code Online (Sandbox Code Playgroud)

java spring spring-test spring-boot spring-web

33
推荐指数
7
解决办法
4万
查看次数

在测试中使用@MockBean强制重新加载Application Context

我在Spring Framework上运行了几个集成测试,扩展了名为BaseITCase的基类.
像这样:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {AppCacheConfiguration.class, TestConfiguration.class}, loader = SpringBootContextLoader.class)
@Transactional
@WebMvcTest
public abstract class BaseITCase{...}
...
public class UserControllerTest extends BaseITCase {...}
Run Code Online (Sandbox Code Playgroud)

问题是其中一个测试有几个声明:@MockBean在它内部以及执行此测试的那一刻,Spring重新创建上下文,并且在此之后的测试有时使用错误的bean(来自为@的测试创建的上下文) MockBean).我通过检查bean有不同的哈希码来发现这一点.

当我使用@EventListener时,它变得非常关键.因为调用了错误上下文(已经完成执行的测试类的上下文)的侦听器,并且我在那里有错误的bean.

那有什么解决方法吗?

我试图将所有@MockBean声明移动到基本类,它工作正常,因为没有创建新的上下文.但是,它使基础课太重了.此外,我尝试为此测试创建一个脏上下文,但接下来的测试失败,并显示上下文已被关闭的消息.

java spring spring-test mockito springmockito

9
推荐指数
2
解决办法
2929
查看次数

使用 @Configuration bean 覆盖 @FeignClient 进行测试

是否可以通过@FeignClient创建@Configuration包含模拟版本的 bean 进行测试来覆盖通过注释创建的bean?

我已经尝试过了,但似乎@FeignClientbean 是最后创建的(或者我认为是这样),因为在我的测试中,我总是注入真实版本而不是模拟版本。在同一个配置文件中,我创建了另一个没有任何注释(除了@Component)的bean,通过使用真实的名称以相同的方式模拟,并且它完美地工作。

我试过用@MockBean它来模拟它并且它有效,但该项目有一些怪癖,这使得创建另一个 Spring 上下文破坏了测试。

谢谢。

编辑。实际上,我只是调试了测试并意识到,如果我使用与 Feign 客户端相同的名称,调试器甚至不会在@Configurationbean 中停下来创建模拟版本。将名称更改为其他名称可以正常工作,但它只会使用新名称创建另一个相同类型的 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 …
Run Code Online (Sandbox Code Playgroud)

java spring unit-testing mockito feign

5
推荐指数
1
解决办法
3643
查看次数