当前位置: 首页 > 知识库问答 >
问题:

无法对SpringBoot执行@Autowired a bean on集成测试

陈马鲁
2023-03-14

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

更新

这个类来自类似的项目,它可以工作(但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);
    }


}

我复制了一个项目。

更新\u 2

我清除了本地Maven存储。IDE还(在编译时)突出显示可能未自动连接的字段。但我运行了一个测试类,它可以工作。。。

为什么?(这可能是在我刚刚重命名包并编辑pom.xml时开始的)

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

谁可以分享关于这个问题的想法?

共有1个答案

邓建柏
2023-03-14

您正在尝试为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);
}
}
 类似资料:
  • 我有几个繁重的Spring集成测试(是的,这不是最好的方法,我没有时间正确地模拟所有外部dep) 下面是测试的典型注释 由于以下原因,测试会定期失败: 这里有两个问题:1、让测试共存的正确方式是什么?我在surefire插件中设置了forkCount=0。好像有帮助 2.1. 在每次测试期间,我实际上不需要启动所有的

  • 我有一个用selenium进行单元测试和集成测试的项目。 当我用IntelliJ执行cucumber集成测试时,它工作得很好,您可以看到: 用Intellij执行cucumber集成测试 但是,当我执行mvn集成测试时,似乎没有发现任何联调: 故障保护输出 我定义了以下POM: > 文件夹结构是文件夹结构 mvn集成-测试输出https://drive . Google . com/file/d/

  • 全部的 我在我的主要Spring Boot应用程序类中定制了,如下所示。 其中,是的扩展。我的POJO是用Jackson的注释的 我使用和注释通过HTTP公开了POJO。这很好,当我运行应用程序并访问endpoint时,会调用自定义过滤器。 现在我编写了一个集成测试,如下所示。 当我运行测试时,obj为null,我看到一个错误,没有配置FilterProvider 我做错了什么,如何纠正? 我的文

  • 我现在开始学习Java和Spring Boot,并且在集成测试中遇到了一些依赖注入问题。我在src/main/java/com/rfd/domain/service下有一个名为TransactionService的类,它被标记为@Service,它有另一个依赖项,其中一个是Spring Boot创建的存储库。当我启动应用程序时,它会正确启动,因此我假设依赖项正在正确解析。这是总结的类: 现在,我在

  • 我正在使用一个带有spring boot 2.0.0.rc1的多项目分级器。我的子项目之一是SpringBoot应用程序,其中包含了我的集成测试。 集成测试用WebEnvironment.random_port标记为@springboottest。由于未解析的依赖关系(在另一个子项目中声明的服务,的同级),测试失败,使用了gradle命令行,但在Eclipse IDE中成功。 如果有人有主意?如何