提问者:小点点

实体JpaRepository方法在测试期间不起作用


我的Java Spring服务器中有一个服务方法,应该将用户保存到数据库。

@Override
public User addUser(User user) {
    log.info("Saving new user {} to the database", user.getUsername());
    user.setPassword(passwordEncoder.encode(user.getPassword()));
    return userRepository.save(user);

}

然后我有测试课。

@Slf4j
@ExtendWith(MockitoExtension.class)
public class UserTest {
@InjectMocks
UserServiceImpl userService;

@Mock
private UserRepository userRepository;
@Mock
private PasswordEncoder passwordEncoder;

@ParameterizedTest
@CsvSource({
        "username, password, 1, test@test.com, admin, true",
})
void checkIfUserCanBeAdded(String username,String password,int group_id,String email,String role,Boolean active){
    
    //given
    User user = new User(username, password, group_id, email, role, active);

    //when
    User result = userService.addUser(user);

    //then
    assertSame(result.getUsername(),user.getUsername());
    assertSame(result.getPassword(), user.getPassword());
    assertSame(result.getGroup_id(), user.getGroup_id());
    assertSame(result.getEmail(), user.getEmail());
    assertSame(result.getEmail(), user.getEmail());
    }
}

但显然userRepository.save()方法返回null

java.lang.NullPointerException: Cannot invoke "sensor.management.sensor_admin.domain.entity.User.getUsername()" because "result" is null

有什么解决办法?为什么它不起作用?

编辑:我决定将测试更改为下面的代码,它现在可以正常工作

    @BeforeEach
    public void setup(){
        user = new User(1,"username", "password", 1, "test@test.com", "admin", true);
    }

    @Test
    void checkIfUserCanBeAdded(){

        //given
        given(userRepository.save(user)).willReturn(user);

        //when
        User savedUser = userService.addUser(user);

        assertNotNull(savedUser);
    }

共1个答案

匿名用户

请在User result=userService.addUser(User)之前添加以下语句:,然后重试。

Mockito.when(passwordEncoder.encode(Mockito.anyString())).thenReturn(user.getPassword());
Mockito.when(userRepository.save(Mockito.any())).thenReturn(user);