gpt4 book ai didi

spring-boot - JUNIT5 @InjectMocks 抛出 NullPointerException

转载 作者:行者123 更新时间:2023-12-04 14:45:10 25 4
gpt4 key购买 nike

这是我使用 TDD 和 JUNIT 5 的第一个项目。我正在为我的项目使用最新的 Springboot。

我注意到,当我有来自 springboot 的依赖项时,当使用 @InjectMocks 注释时,它们不会在测试阶段被注入(inject)。我收到了 authenticationManager 依赖项的 NullPointerException。但是,当 service 方法仅使用使用 springboot JPA 为实体类创建的存储库依赖项时,测试通过。

下面是服务类和对应的测试类。
UserServiceImpl.java

@Service
public class UserServiceImpl implements UserService {

@Autowired
AuthenticationManager authenticationManager;

@Autowired
UserRepository userRepository;

@Autowired
PasswordEncoder passwordEncoder;

@Autowired
UserDetailsService userDetailsService;

@Autowired
JWTUtil jwtUtil;

@Override
@Transactional
public AuthenticationResponseDTO login(AuthenticationRequestDTO authenticationRequestDTO) {
try {
authenticationManager.authenticate(
new UsernamePasswordAuthenticationToken(authenticationRequestDTO.getUserName(), authenticationRequestDTO.getPassword()));

UserDetails userDetails = userDetailsService.loadUserByUsername(authenticationRequestDTO.getUserName());

return new AuthenticationResponseDTO(userDetails.getUsername(), jwtUtil.generateToken(userDetails));
}
catch (BadCredentialsException e) {
throw e;
}
}

UserServiceImplTest.java
@InjectMocks
private UserServiceImpl userServiceImpl;

@Mock
private UserRepository userRepository;

private User userMock;

private AuthenticationRequestDTO authenticationRequestDTO;

@BeforeEach
void init(){
MockitoAnnotations.initMocks(this);
}

@BeforeEach
void setupUser(){
userMock = new User();
userMock.setUserName("sd");
userMock.setPassword("sd");

authenticationRequestDTO = new AuthenticationRequestDTO();
authenticationRequestDTO.setUserName("sd");
authenticationRequestDTO.setPassword("sd");
}

@Test
void testUserIsPresentOrNot(){

Mockito.when( userRepository.findByUserName("sd") ).thenReturn(userMock);

AuthenticationResponseDTO responseDTO = userServiceImpl.login(authenticationRequestDTO);

assertNotNull(responseDTO);
assertEquals(userMock.getUserName(), responseDTO.getName(), "user id should be same.");
}

请让我知道是否需要我的进一步详细信息。

最佳答案

我不确定我是否 100% 关注,正如我所看到的那样,您缺少一些注释。

如果你想在单元测试中注入(inject) Spring bean,你需要 @SpringBootTest/@ExtendWith(SpringExtension.class) (从我的角度来看,进行集成测试)。

如果你想使用 Mockito@InjectMocks@Mock要求 @ExtendWith(MockitoExtension.class)以上测试类。

并删除以下内容。

@BeforeEach
void init(){
MockitoAnnotations.initMocks(this);
}

从我的角度来看,将依赖注入(inject)与 spring 和 Mockito 混合使用会过于复杂。我宁愿只使用 Mockito 进行单元测试。

也许是 following文章可以提供帮助。

关于spring-boot - JUNIT5 @InjectMocks 抛出 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61710145/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com