2013-07-15 3 views
2

У меня есть много пружинных услуг с этим autowire:Spring боб autowire для тестирования

@Autowired 
private SmartCardService smartCardService; 

Мне нужна фиктивный класс для тестирования и я определил этот класс, расширяющий оригинальный:

@Service 
public class DummySmartCardService extends SmartCardService{ 
    ... 
} 

Как я могу убедитесь, что все autwire возьмут манекен вместо оригинального сервиса, не изменяя аннотацию Autwired?

Спасибо.

+0

Именно поэтому я предпочитаю конфигурацию XML. –

ответ

3

Рассмотрите возможность использования аннотации @Primary. См here

1

Загрузите DummySmartCardService боб из тестовой версии файла контекста приложения, а не так, что никаких изменений в коде Испытуемые не нужны

@ContextConfiguration(locations = {"classpath:test-services.xml"}) 
0

Используйте аннотацию @Resource или @Qualifier, С @ Классификатор, который различает типы боб:

@Autowired 
@Qualifier("testing") 
private SmartCardService smartCardService; 

@Service 
@Qualifier("testing") 
public class DummySmartCardService extends SmartCardService{ 
    ... 
} 

Или с @Resource, которая использует по имени семантику:

@Resource("dummySmartCardService") 
private SmartCardService smartCardService; 


@Service("dummySmartCardService") 
public class DummySmartCardService extends SmartCardService{ 
    ... 
} 

Теоретически вы можете использовать @Qualifier("beanName"), но это обескураживает.

Но думает, что было бы лучше, если бы вы имели профиль Spring для загрузки только корешков, связанные испытаний в тестах:

@Service 
@Profile("test") 
public class DummySmartCardService extends SmartCardService{ 
    ... 
} 

@ContextConfiguration(locations = {"classpath:services.xml"})  
@ActiveProfiles("test") 
public class TestSuite{ 
    @Autowired 
    private SmartCardService smartCardService; 
} 
+0

И таким образом вам нужно изменить код перед запуском тестов –

+0

@ ŁukaszLech да, иногда я предпочитаю xml, но нет ничего плохого в использовании аннотаций, зная, как их использовать. – ElderMael

+0

Проблема в том, что мне нужно изменить ALL @Autowired annotation – Tobia

0

ИМХО вы должны взглянуть на Springockio для правильной и достаточно легкой насмешки весенней фасоли ,

Вы можете заменить фасоль с издеваться или обернуть с Spy таким образом:

@ContextConfiguration(loader = SpringockitoContextLoader.class, 
locations = "classpath:/context.xml") 
public class SpringockitoAnnotationsMocksIntegrationTest extends 
           AbstractJUnit4SpringContextTests { 

    @ReplaceWithMock 
    @Autowired 
    private InnerBean innerBean; 

    @WrapWithSpy 
    @Autowired 
    private AnotherInnerBean anotherInnerBean; 
    .... 
} 

Это не только чистый путь (вы не нужно изменить код тестируется путем добавления классификаторов или профилей), но также позволяет использовать возможности Mockito для насмешек, проверки и шпионажа, что отлично.

+0

Великий в теории, на практике у этого проекта много неприятных ошибок. –

Смежные вопросы