java - 如何在 Spring Boot 中创建调用包含构造函数注入(inject)的服务的测试?

标签 java spring spring-boot testing junit

我正在尝试在 Spring-Boot 项目中编写测试。我的问题是我无法使用包含构造函数注入(inject)的服务。

根据我的尝试,我会收到类似 java.lang.IllegalStateException: Failed to load ApplicationContextNullPointerException 的错误。

我的第一个尝试是将服务中的构造函数注入(inject)更改为字段注入(inject)。但是看完这个post我决定改回以前的方式。 然后我搜索了示例,但找不到有用的东西。

以下是相关的代码片段。如果需要更多代码,我会提供。

带有构造函数注入(inject)的服务类:

PlayerServiceImpl.java

@Service
public class PlayerServiceImpl implements PlayerService {

    private PlayerRepository playerRepository;
    private CompanyService companyService;
    private CompanyResourceService companyResourceService;

    @Autowired
    public PlayerServiceImpl(PlayerRepository thePlayerRepository, CompanyService theCompanyService,
                             CompanyResourceService theCompanyResourceService) {
        this.playerRepository = thePlayerRepository;
        this.companyService = theCompanyService;
        this.companyResourceService = theCompanyResourceService;
    }

...

}

我正在尝试创建的测试类:

PlayerServiceImplIntegrationTest.java

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

    @TestConfiguration
    static class PlayerServiceImplTestContextConfiguration {

        private PlayerRepository playerRepository;
        private CompanyService companyService;
        private CompanyResourceService companyResourceService;

        @Bean
        public PlayerService playerService() {
            return new PlayerServiceImpl(playerRepository, companyService, companyResourceService);
        }
    }

    @Autowired
    private PlayerService playerService;

    @MockBean
    private PlayerRepository playerRepository;

    @Before
    public void setUp() {
        Player max = new Player("MaxMustang", "test123", "MaxMustang",
                "max.mustang@test.com", new Date(System.currentTimeMillis()), 1, 0,
                new BigDecimal("0.00"), new BigDecimal("0.00"), 0, 0);

        Mockito.when(playerRepository.findByUserName(max.getUserName()))
                .thenReturn(max);
    }

    @Test
    public void whenFindById_thenReturnPlayer() {
        String userName = "MaxMustang";

        Player found = playerService.findByUserName(userName);

        assertThat(found.getUserName()).isEqualTo(userName);
    }
}

在我的测试中,我试图创建一个播放器对象并接收它。这只是我在 Spring Boot 中的第一次测试。我的主要目标是让测试运行起来。 原始测试来自Baeldung来自“5.用@MockBean 模拟”。但是在四处试验时,我添加或更改了一些东西。

如果我错过了指出相同问题的帖子,我会很高兴被告知。

此外,如果有人能告诉我我的服务构造函数中的参数是否过多或仍在“正常”范围内,我将不胜感激。

最佳答案

您必须使配置 bean 成为主要 bean,并在该方法上使用构造函数注入(inject):

    @TestConfiguration
    static class PlayerServiceImplTestContextConfiguration {

      @Bean
      @Primary
      public PlayerService playerService(PlayerRepository playerRepository,
            CompanyService companyService, CompanyResourceService companyResourceService) {
        return new PlayerServiceImpl(playerRepository, companyService, companyResourceService);
      }
    }

如果没有 primary,你将有两个相同类型的 bean float ,你不在这里使用 @Qualifier。此外,您不能在配置类中使用 @Autowire bean,这就是您需要使用构造函数注入(inject)的原因。

关于java - 如何在 Spring Boot 中创建调用包含构造函数注入(inject)的服务的测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57605071/

相关文章:

java - 如何为某些场景制作正则表达式模式

java - 在树集上使用迭代器的无限循环,我正在调用 next() 方法

java - Spring引导管理配置

java - 如何为具有spring存储库代码的@Component类编写集成测试?

java - Spring security UserDetails服务配置

java - 对象的 NullPointerException

java - 如何解压包含子目录的 zip 存档?

java - spring cloud aws多个sqs监听器

java - 使用 Spring boot 将 RESTful 服务部署到 AWS

java - Spring Boot Maven 多模块项目 - 单元测试(应用程序上下文)