Use different Spring test context configuration for different test methods

后端 未结 2 1384
一整个雨季
一整个雨季 2021-02-08 01:07

We have a Spring based JUnit test class which is utilizing an inner test context configuration class

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguratio         


        
相关标签:
2条回答
  • 2021-02-08 01:41

    With Aaron's suggestion of manually building the context I couldn't find any good examples so after spending some time getting it working I thought I'd post a simple version of the code I used in case it helps anyone else:

    class MyTest {
    
        @Autowired
        private SomeService service;
        @Autowired
        private ConfigurableApplicationContext applicationContext;
    
        public void init(Class<?> testClass) throws Exception {
            TestContextManager testContextManager = new TestContextManager(testClass);
            testContextManager.prepareTestInstance(this);
        }
    
        @After
        public void tearDown() throws Exception {
            applicationContext.close();
        }
    
        @Test
        public void test1() throws Exception {
            init(ConfigATest.class);
            service.doSomething();
            // assert something
        }
    
        @Test
        public void test2() throws Exception {
            init(ConfigBTest.class);
            service.doSomething();
            // assert something
        }
    
        @ContextConfiguration(classes = {
            ConfigATest.ConfigA.class
        })
        static class ConfigATest {
            static class ConfigA {
                @Bean
                public SomeService someService() {
                    return new SomeService(new A());
                }
            }
        }
    
        @ContextConfiguration(classes = {
            ConfigBTest.ConfigB.class
        })
        static class ConfigBTest {
            static class ConfigB {
                @Bean
                public SomeService someService() {
                    return new SomeService(new B());
                }
            }
    
        }
    }
    
    0 讨论(0)
  • 2021-02-08 01:56

    I use these approaches when I'm have to solve this:

    • Manually build the context in a setup method instead of using annotations.
    • Move the common test code to a base class and extend it. That allows me to run the tests with different spring contexts.
    • A mix of the two above. The base class then contains methods to build spring contexts from fragments (which the extensions can override). That also allows me to override test cases which don't make sense or do extra pre/post work in some tests.

    Keep in mind that annotations only solve generic cases. You'll have to replicate some or all of their work when you leave the common ground.

    0 讨论(0)
提交回复
热议问题