2013-07-30 2 views
0

Итак, я работаю на некоторых весенних испытаниях, которые требуют инъекций зависимостей с использованием аннотаций:DRY Spring AnnotationConfig тестирование

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(loader=AnnotationConfigContextLoader.class) 
public class BeanTest { 

    @Autowired 
    private SomeService someService; 

    @Configuration 
    static class ContextConfiguration { 
    @Bean 
    public SomeService someService() { 
     return new SomeService(); 
    } 
    } 
} 

Я бы очень хотел, чтобы не повторять этот код в каждом тесте, но мои попытки создать базовый класс, который содержит конфигурацию:

@Configuration 
class MyContextConfiguration { 
    @Bean 
    public SomeService someService() { 
     return new SomeService(); 
    } 
} 

И производный от него:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(loader=AnnotationConfigContextLoader.class) 
public class BeanTest { 

    @Autowired 
    private SomeService someService; 

    @Configuration 
    static class ContextConfiguration extends MyContextConfiguration {} 
} 

Кажется, не работает. Может ли кто-нибудь предложить способ СУХОЙ?

Спасибо!

ответ

1

Вы должны это сделать.

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration 
public class BeanTest { 

    @Autowired 
    private SomeService someService; 

    @Configuration 
    @Import(MyContextConfiguration.class) 
    static class ContextConfiguration { 
    .... 
    } 
} 

Кроме того, вам не нужно упомянуть AnnotationConfigContextLoader, Spring по соглашению будет автоматически подобрать статический внутренний класс с аннотацией @Configuration и использовать соответствующие ContextLoader

+0

Похоже, что аннотация @Import должна заменить внутренний класс и аннотации. Если вы можете удалить это, я могу принять это ... – pschuegr

+0

Не 'MyContextConfiguration', но' ContextConfiguration' в вашем примере выше, и поскольку это импортирует 'MyContextConfiguration', все компоненты из этого должны быть видимыми в тесте. по существу, любой статический класс, аннотированный с помощью @ Configuraiton. Здесь есть небольшая статья в блоге с дополнительной информацией о стандартах по умолчанию - http://www.java-allandsundry.com/2012/08/contextconfiguration-defaults.html –

1

Вы можете объявлять классы конфигурации в contextconfiguration в -annotation. Из документации.

ContextConfiguration Определяет метаданные на уровне классов, которые используются для определения того, как загрузить и настроить ApplicationContext для тестов интеграции. В частности, @ContextConfiguration объявляет местоположения ресурса контекста приложения или аннотированные классы, которые будут использоваться для загрузки контекста. Расположение ресурсов - это файлы конфигурации XML, расположенные в пути к классам; тогда как аннотированные классы обычно являются классами @Configuration. Однако расположение ресурсов также может относиться к файлам в файловой системе, а аннотированные классы могут быть составными классами и т. Д.

пример из документации.

@ContextConfiguration(classes = TestConfig.class) 
public class ConfigClassApplicationContextTests { 
    // class body... 
} 
Смежные вопросы