Я пытаюсь выпустить следующий тест:
@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);
}
У вас есть @ComponentScan
но вы не @ComponentScan
имя пакета для сканирования. Поведение по умолчанию - это сканирование из пакета, в который вы поместили @ComponentScan
существу, пакет вашего конфигурационного класса DBDataManipulatorServiceContext
. Я предполагаю, что это не где ваш DBDataManipulatorService
, если так просто указать имя пакета для @ComponentScan
Вам нужно как-то пометить класс DBDataManipulatorService. Используйте @service или @component аннотацию над именем класса. Это сообщит весне, чтобы управлять классом и, таким образом, ввести его в свой тест.
По умолчанию @Autowired
аннотация означает, что bean должен был быть найден, иначе вы бы получили bean не найденное исключение.
Есть несколько вещей, которые могут вызвать это:
Единичный тест new DBDataManipulatorServiceContext()
помощью new DBDataManipulatorServiceContext()
вместо сканирования в качестве Spring Bean, в этом случае @Autowired
игнорируется.
Существует некоторая конфигурация XML, которая переопределяет конфигурацию аннотаций, и поэтому компонент сначала создается с помощью autowiring, а затем отбрасывается компонентом, определенным в XML, без параметра, предоставленного для отсутствующего свойства
DBDataManipulatorService
. Это не в вашей конфигурации право ..