我正在尝试在 Spring-Boot 项目中编写测试。我的问题是我无法使用包含构造函数注入(inject)的服务。
根据我的尝试,我会收到类似 java.lang.IllegalStateException: Failed to load ApplicationContext
或 NullPointerException
的错误。
我的第一个尝试是将服务中的构造函数注入(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/