2014-09-17 3 views
2

Я использую тесты JUnit с конфигурацией Spring, определенной в классе, аннотированном @Configuration в моем тесте JUnit. Тесты выглядит следующим образом:Как использовать пользовательскую область Spring с модульными тестами (SpringJUnit4ClassRunner)

@ContextConfiguration(classes = MyConfiguration.class}) 
@RunWith(SpringJUnit4ClassRunner.class) 
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) 
public class SomeIntegrationTest { 

    @Autowired 
    private MyConfiguration myConfiguration; 

    @Test 
    public void someTest() throws Exception { 
     myConfiguration.myBean(); 
    } 
} 

В MyConfiguration, я хотел бы использовать Spring сферу SimpleThreadScope:

@Configuration 
public class MyConfiguration { 

    @Bean 
    @Scope("thread") 
    public MyBean myBean() { 
     return new MyBean(); 
    } 
} 

При запуске теста, объем не зарегистрирован, хотя. Я получаю

java.lang.IllegalStateException: Failed to load ApplicationContext 
... 
Caused by: java.lang.IllegalStateException: No Scope registered for scope 'thread' 

Я знаю, как настраиваемая область может быть зарегистрирована программно: context.getBeanFactory().registerScope("thread", new SimpleThreadScope());
, и я хотел бы, чтобы избежать использования конфигурации Spring XML.

Есть ли способ, как я могу зарегистрировать пользовательскую область в модульном тесте?

+0

вы решили эту проблему? если да, то как вы его решили? – Xstian

+0

Привет, я нашел довольно изящное решение, но я как бы спрятал его где-то и не могу найти его сейчас (код был реорганизован с) :). Позвольте мне взглянуть на него немного дольше. – Mifeet

ответ

4

Проверить это выполнение слушателем:

public class WebContextTestExecutionListener extends 
      AbstractTestExecutionListener { 

     @Override 
     public void prepareTestInstance(TestContext testContext) throws Exception { 

      if (testContext.getApplicationContext() instanceof GenericApplicationContext) { 
       GenericApplicationContext context = (GenericApplicationContext) testContext.getApplicationContext(); 
       ConfigurableListableBeanFactory beanFactory = context 
         .getBeanFactory(); 
       Scope requestScope = new SimpleThreadScope(); 
       beanFactory.registerScope("request", requestScope); 
       Scope sessionScope = new SimpleThreadScope(); 
       beanFactory.registerScope("session", sessionScope); 
       Scope threadScope= new SimpleThreadScope(); 
       beanFactory.registerScope("thread", threadScope); 
      } 
     } 
    } 

в тесте вы можете поместить этот

@ContextConfiguration(classes = MyConfiguration.class}) 
    @RunWith(SpringJUnit4ClassRunner.class) 
    @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) 
    @TestExecutionListeners({ WebContextTestExecutionListener.class}) 
    public class UserSpringIntegrationTest { 

    @Autowired 
    private UserBean userBean; 

    //All the test methods 
    }