Showing results for 
Search instead for 
Did you mean: 

Overriding beans in Integration tests


For my Spring-Boot app I provide a RestTemplate though a @Configuration file so I can add sensible defaults(ex Timeouts). For my integration tests I would like to mock the RestTemplate as I dont want to connect to external services - I know what responses to expect. I tried providing a different implementation in the integration-test package in the hope that the latter will override the real implementation , but checking the logs it`s the other way around : the real implementation overrides the test one.

How can I make sure the one from the TestConfig is the one used?

This is my config file :

public class RestTemplateProvider {

    private static final int DEFAULT_SERVICE_TIMEOUT = 5_000;

    public RestTemplate restTemplate(){
        return new RestTemplate(buildClientConfigurationFactory());

    private ClientHttpRequestFactory buildClientConfigurationFactory() {
        HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
        return factory;

Integration test:


@SpringApplicationConfiguration(classes = TestConfiguration.class)
public abstract class IntegrationTest {}

TestConfiguration class:


@Import({Application.class, MockRestTemplateConfiguration.class})
public class TestConfiguration {}

And finally MockRestTemplateConfiguration


public class MockRestTemplateConfiguration {

    public RestTemplate restTemplate() {
        return Mockito.mock(RestTemplate.class)




Thus, bean overriding is a default behavior that happens when we define a bean within an ApplicationContext which has the same name as another bean. It works by simply replacing the former bean in case of a name conflict.