Search code examples
springspring-bootspring-annotations

Overriding an Autowired Bean in Unit Tests


Is there a simple way I can easily override an autowired bean in specific unit tests? There is only a single bean of every type in the compile classes so it's not a problem for autowiring in this case. The test classes would contain additional mocks. When running a unit test I'd simply like to specify an additional Configuration that says basically, while running this unit test use this mock instead of the standard bean.

Profiles seem a bit overkill for what I require and I'm not sure this would be achievable with the Primary annotation as different unit test could have different mocks.


Solution

  • If you just simply want to provide a different bean in your tests, i think you don't need to use spring profiles or mockito.

    Just do the following:

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringApplicationConfiguration(classes = { TestConfig.class })
    public class MyTest
    {
        @Configuration
        @Import(Application.class) // the actual configuration
        public static class TestConfig
        {
            @Bean
            public IMyService myService()
            {
                return new MockedMyService();
            }
        }
    
        @Test
        public void test()
        {
            ....
        }
    }
    

    NOTE: tested with spring boot 1.3.2 / spring 4.2.4