Невозможно выполнить компонент @Autowired bean при тестировании интеграции для SpringBoot - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть приложение на SpringBoot 2.x

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
public class WebSpringBootJarApplication extends SpringBootServletInitializer implements WebApplicationInitializer {

    public static void main(String[] args) {
        SpringApplication.run(WebSpringBootJarApplication.class, args);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(WebSpringBootJarApplication.class);
    }
}

pom. xml

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>weblogic.war.spring.boot</groupId>
    <artifactId>weblogic-war-spring-boot</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>weblogic-war-spring-boot</name>
    <packaging>war</packaging>

Это класс, который должен быть автоматически подключен ...

@Service
public class CompanyReadServiceImpl implements CompanyReadService {

    private CompanyMapper companyMapper;

    private CompanyReadRepository companyReadRepository;


    @Autowired
    public CompanyReadServiceImpl(CompanyMapper companyMapper,
                                  CompanyReadRepository companyReadRepository) {
        this.companyMapper = companyMapper;
        this.companyReadRepository = companyReadRepository;
    }

    @Transactional
    @Override
    public CompanyDto getById(Long id) {

        Company company = find(id);

        return transform(company);
    }


    @Transactional
    @Override
    public boolean isByName(String name) {
        return this.companyReadRepository.findByName(name).isPresent();
    }

    @Transactional
    @Override
    public CompanyDto getByName(String name) {

        Company company = companyReadRepository.findByName(name).orElse(new Company());

        return transform(company);

    }

    private Company find(Long id){

       return this.companyReadRepository.findById(id).orElseThrow(() -> new RuntimeException("User not found"));
    }

    private CompanyDto transform(Company company){

        return this.companyMapper.companyToCompanyDto(company);
    }
}

pom. xml

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
         </dependency>

update

Этот класс из аналогичного проекта, и он работает (но идея Intellij помечает поля как ошибки )

в src / test / java / weblogic / war / spring / boot / service / read / CompanyReadServiceTest. java

@RunWith(SpringRunner.class)
@SpringBootTest
public class CompanyReadServiceTest {

    private static final Logger LOGGER = LoggerFactory.getLogger(CompanyReadServiceTest.class);

    private static String NAME_METHOD_READ_BY_NAME_BOOLEAN = "isByName";

    @Autowired
    private CompanyReadRepository companyReadRepository;

    @Autowired
    private CompanyReadService companyReadService;

    @Autowired
    private CompanyReadRepositoryTest companyReadRepositoryTest;

    @Autowired
    private CompanyMapper companyMapper;

    @Test
    public void getById() {

        Company lastEntry = getLastEntry();

        Long idExpected = null;
        if(lastEntry != null) idExpected = lastEntry.getId();

        if(idExpected != null){

            CompanyDto companyDto = searchByIdEntry(idExpected);
            Long idActual = companyDto.getId();

            Assert.assertEquals("Lookup of entry - failed!!!", idExpected, idActual );
        }

    }

    @Test
    public void isByName() {

        Company lastEntry = getLastEntry();

        String name = null;
        if(lastEntry != null) name = lastEntry.getName();


        if(name != null){
            boolean entryByName = isEntryByName(name);
            Assert.assertTrue("Lookup of entry - failed", entryByName);
        }
    }


    private CompanyDto searchByIdEntry(Long id){

        return this.companyReadService.getById(id);
    }


    private boolean isEntryByName(String name){

        return getByNameReflection(companyReadService, NAME_METHOD_READ_BY_NAME_BOOLEAN, name);
    }


    private Company getLastEntry() {

        Optional<Company> lastEntry = companyReadRepositoryTest.getLastEntry();

        return lastEntry.orElse(null);
    }


}

Я делаю скопировать проект.

update_2

Я очистил локальное хранилище Maven. В среде IDE также (во время компиляции) выделяются поля, которые предположительно не подключены автоматически. но я провожу тестовый класс, и он работает ...

Почему? (Это могло начаться, когда я просто переименовал пакет и отредактировал pom. xml)

Автоматическое подключение хорошо работает в рабочей области приложения. но это не работает в области тестирования приложения.

Кто может поделиться идеями по этому вопросу?

1 Ответ

0 голосов
/ 14 февраля 2020

Вы пытаетесь загрузить фактический контекст приложения для целей Junit. Вы можете сделать это, используя ниже, где класс WebSpringBootJarApplication является исходным контекстом Spring

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {WebSpringBootJarApplication.class})
public class HelloWorldTest {

@Autowired(required = true)
SomeService service;

@Test
public void helloTest() {
    System.out.println(service);
}
}
...