@Autowired не вводит мой сервис в мой управляемый компонент

1

Я пытаюсь выпустить следующий тест:

 @RunWith(SpringJUnit4ClassRunner.class)
 @ContextConfiguration(classes = DBDataManipulatorServiceTestContext.class, loader =  
  SpringApplicationContextLoader.class)
 @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
 public class UserInterfaceBeanTest {

 @Autowired
private DBDataManipulatorService dbDataManipulatorService;
 .....

 @Test
public void testGetDistinctWorkPackageId() {

    WorkPackage workPackage1 = new WorkPackage();
    workPackage1.setWorkPackageId("TEST1");
    workPackage1.setWorkPackageName("WP_1");

    WorkPackage workPackage2 = new WorkPackage();
    workPackage2.setWorkPackageId("TEST2");
    workPackage2.setWorkPackageName("WP_2");

    WorkPackage workPackage3 = new WorkPackage();
    workPackage3.setWorkPackageId("TEST3");
    workPackage3.setWorkPackageName("WP_3");

    WorkPackage workPackage4 = new WorkPackage();
    workPackage4.setWorkPackageId("TEST4");
    workPackage4.setWorkPackageName("WP_4");

    Aircraft aircraft1 = new Aircraft();
    aircraft1.setAircraftId(50001);
    aircraft1.setModel("100");

    Aircraft aircraft2 = new Aircraft();
    aircraft2.setAircraftId(50002);
    aircraft2.setModel("100");

    aircraft1.addOrUpdateWorkPackageToAircraft(workPackage1);
    aircraft1.addOrUpdateWorkPackageToAircraft(workPackage3);

    aircraft2.addOrUpdateWorkPackageToAircraft(workPackage2);
    aircraft2.addOrUpdateWorkPackageToAircraft(workPackage3);

    Map<Integer, Aircraft> aircraftsMap = new HashMap<Integer, Aircraft>();
    aircraftsMap.put(50001, aircraft1);
    aircraftsMap.put(50002, aircraft2);


    UserInterfaceBean userInterfaceBean = new UserInterfaceBean();
    userInterfaceBean.setModel("100");

    aircraftsMap = dbDataManipulatorService.saveToDataBase(aircraftsMap);

    List<String> workPackgesIds = userInterfaceBean.getDistinctWorkPackageId();

    assertTrue(workPackgesIds.contains("TEST1"));
    assertTrue(workPackgesIds.contains("TEST2"));
    assertTrue(workPackgesIds.contains("TEST3"));
    assertTrue(!workPackgesIds.contains("TEST4"));
}

Но я получаю NullPointerException из-за dbDataManipulatorService, который неправильно введен, мой serviceContext следующий:

@ComponentScan
@EnableAutoConfiguration
@EnableBatchProcessing
@EnableJpaRepositories
public class DBDataManipulatorServiceContext {

.....

@Bean
public DataSource dataSource() {
    return new EmbeddedDatabaseBuilder().setName("aircraft").setType(H2)
            .build();
}

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(
    DataSource dataSource, JpaVendorAdapter jpaVendorAdapter) {
    LocalContainerEntityManagerFactoryBean lef = new  
            LocalContainerEntityManagerFactoryBean();
    lef.setDataSource(dataSource);
    lef.setJpaVendorAdapter(jpaVendorAdapter);
    lef.setPackagesToScan("com");
    return lef;
}

@Bean
public JpaVendorAdapter jpaVendorAdapter() {
    HibernateJpaVendorAdapter hibernateJpaVendorAdapter = 
                                  new HibernateJpaVendorAdapter();
    hibernateJpaVendorAdapter.setShowSql(true);
    hibernateJpaVendorAdapter.setGenerateDdl(true);
    hibernateJpaVendorAdapter.setDatabase(Database.H2);
    return hibernateJpaVendorAdapter;
}

..... 

Может ли кто-нибудь сказать мне, где проблема? и как его решить.

РЕДАКТИРОВАТЬ

Здесь мой DBDataManipulatorServiceImpl:

@Service
@Transactional
public class DBDataManipulatorServiceImpl implements DBDataManipulatorService {

.....

}

И вот он интерфейс:

 public interface DBDataManipulatorService {


public AircraftRepository getAircraftRepository();

public Aircraft getAircraftById(String id);

public Map<Integer, Aircraft> saveToDataBase(Map<Integer, Aircraft> aircrafts);

public MyJob findJobByJobId(String jobId);

public WorkPackage findWorkPackageByAircraftIdAndWorkPackageId
                        (int aircraftId, String workPackageId);

public Aircraft findAircraftByaircraftId(int aircraftId);

public List<Aircraft> findAllAircrafts();

public List<String> findAllAvailableAircraftsModels();

public List<Aircraft> findAllAircraftsByModel(String model);

public List<WorkPackage> getWorkPackagesByAircraftModel(String model);

}

  • 0
    Вопрос: Где находится конфигурация для вашего компонента DBDataManipulatorService . Это не в вашей конфигурации право ..
  • 0
    Пожалуйста, проверьте обновленную редакцию.
Теги:
spring
hibernate

3 ответа

1

У вас есть @ComponentScan но вы не @ComponentScan имя пакета для сканирования. Поведение по умолчанию - это сканирование из пакета, в который вы поместили @ComponentScan существу, пакет вашего конфигурационного класса DBDataManipulatorServiceContext. Я предполагаю, что это не где ваш DBDataManipulatorService, если так просто указать имя пакета для @ComponentScan

  • 0
    Пожалуйста, обратите внимание на мой код. Я уже указал пакет для сканирования в DBDataManipulatorServiceContext, используя: lef.setPackagesToScan ("com"), в то время как DBDataManipulatorService находится в com.services
  • 0
    Это не сработает, это сканирование для классов сущностей JPA, а не для бинов Spring, вы должны добавить @ComponentScan, как я указал.
Показать ещё 2 комментария
0

Вам нужно как-то пометить класс DBDataManipulatorService. Используйте @service или @component аннотацию над именем класса. Это сообщит весне, чтобы управлять классом и, таким образом, ввести его в свой тест.

  • 0
    это уже так.
  • 0
    Что находится в DBDataManipulatorServiceTestContext? Я предполагаю, что вы копируете содержимое класса DBDataManipulatorServiceContext. Не так ли?
Показать ещё 1 комментарий
0

По умолчанию @Autowired аннотация означает, что bean должен был быть найден, иначе вы бы получили bean не найденное исключение.

Есть несколько вещей, которые могут вызвать это:

  • Единичный тест new DBDataManipulatorServiceContext() помощью new DBDataManipulatorServiceContext() вместо сканирования в качестве Spring Bean, в этом случае @Autowired игнорируется.

  • Существует некоторая конфигурация XML, которая переопределяет конфигурацию аннотаций, и поэтому компонент сначала создается с помощью autowiring, а затем отбрасывается компонентом, определенным в XML, без параметра, предоставленного для отсутствующего свойства

  • 0
    Спасибо за ваши усилия, но вы не показали мне, как решить мою проблему

Ещё вопросы

Сообщество Overcoder
Наверх
Меню