Я работаю с Spring 4.0.7 и с JUnit о тестировании, конечно.Попытка генерировать ошибку о введении Spring @Autowired field для JUnit
О DI Spring предлагает @Autowired
для использования в трех местах
- конструктор
- сеттер
- поле
Я всегда работаю через два первых, почему никогда третий вариант?
Поскольку я помню, давно прочитал о том, что инъекция в поле не должна использоваться, потому что это имеет отрицательное значение в отношении тестирования. Это делает Юнит.
Примечание: Только для тестирования это проблема. Для времени работы или производства все идет хорошо
Цель: Для демонстрации/академических целей я хочу создать эту проблему.
У меня есть следующая:
Repository
public interface PersonRepository extends JpaRepository<Person, String>{
}
Услуга,
@Service
@Transactional
@Profile("failure")
public class PersonFailTestServiceImpl implements PersonService {
private static final Logger logger = ...
@Autowired
private PersonRepository personRepository;
Других Услуг (вызов или с помощью службы, указанной выше)
@Service
@Transactional
@Profile("failure")
public class PersonFailTestProcessImpl implements PersonProcess {
private static final Logger logger = ...
@Autowired
private PersonService personService;
Как у ou может видеть, что две службы основаны на Field Injection.
Теперь тестирование:
Как бобы загружены
@Configuration
@ComponentScan(basePackages={"com.manuel.jordan.server.infrastructure"},
basePackageClasses={PersonProcess.class,PersonRepository.class, PersonService.class})
public class CentralConfigurationEntryPoint {
}
@ContextConfiguration(classes=CentralConfigurationEntryPoint.class)
public class CentralTestConfigurationEntryPoint {
}
Теперь два тестирования классов
@Transactional
@RunWith(SpringJUnit4ClassRunner.class)
@ActiveProfiles({"development","failure"})
public class PersonServiceImplDevelopmentFailureTest extends CentralTestConfigurationEntryPoint {
@Autowired
private PersonService personService;
@Test
public void savePerson01(){
Person person01 = PersonFactory.createPerson01();
personService.save(person01);
personService.printPerson(personService.findOne("1"));
}
@Transactional
@RunWith(SpringJUnit4ClassRunner.class)
@ActiveProfiles({"development","failure"})
public class PersonProcessImplDevelopmentFailureTest extends CentralTestConfigurationEntryPoint{
@Autowired
private PersonProcess personProcess;
Ну все методы тестирования проходят, все зеленые. Я не знаю, если я что-то отсутствует или через Spring 4 проблема была исправлена
Спасибо, я вижу проблему, это когда я должен вводить * вручную * зависимость для компонента или компонента, изолированного от других. –