代码之家  ›  专栏  ›  技术社区  ›  skyho

无法对SpringBoot的集成测试执行@autowireda bean

  •  0
  • skyho  · 技术社区  · 6 年前

    我在springboot2.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);
        }
    }
    

        <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>
    

    这个类来自于类似的项目,并且可以工作(但是Intellij idea将这些字段标记为错误)

    @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);
        }
    
    
    }
    

    更新_2

    我清理了当地的Maven仓库。

    为什么?(这可能是在我刚刚重命名包并编辑pom.xml文件)

    自动布线在应用程序的工作范围内发生良好。但它在测试应用程序的范围内不起作用。

    0 回复  |  直到 6 年前
        1
  •  -1
  •   prathamesh patil    6 年前

    您正在尝试为Junit加载实际的应用程序上下文。

    @RunWith(SpringRunner.class)
    @ContextConfiguration(classes = {WebSpringBootJarApplication.class})
    public class HelloWorldTest {
    
    @Autowired(required = true)
    SomeService service;
    
    @Test
    public void helloTest() {
        System.out.println(service);
    }
    }