Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 测试JPA存储库的void函数以及更新和删除_Java_Spring Boot_Jpa_Testing_Junit - Fatal编程技术网

Java 测试JPA存储库的void函数以及更新和删除

Java 测试JPA存储库的void函数以及更新和删除,java,spring-boot,jpa,testing,junit,Java,Spring Boot,Jpa,Testing,Junit,我正在为crud应用程序编写测试。我需要测试服务和存储库中的Delete和Update语句。既然存储库不会返回数据,我该如何模拟存储库进行删除和更新 例如: @覆盖 public void makeUserActive(长用户ID){ 试一试{ 可选的userEntityList=usersJpaRepository.findById(userId); UserEntity=userEntityList.get(); userEntity.setIsActive(1); usersJpaRepo

我正在为crud应用程序编写测试。我需要测试服务和存储库中的Delete和Update语句。既然存储库不会返回数据,我该如何模拟存储库进行删除和更新

例如:

@覆盖
public void makeUserActive(长用户ID){
试一试{
可选的userEntityList=usersJpaRepository.findById(userId);
UserEntity=userEntityList.get();
userEntity.setIsActive(1);
usersJpaRepository.save(userEntity);
}捕获(例外e){
记录器错误(“无法成为活动用户”,e);
}
}

如何测试模拟此存储库的服务以及存储库本身,因为它不会返回值

对于返回
void
的方法,您只需验证它们是否已被调用即可。下面是一个模拟对象返回方法和
void
返回方法的示例

@ExtendWith(MockitoExtension.class)
类服务测试{
@嘲弄
私有存储库;
@注射模拟
私有服务;//假设这是您的类
@试验
void testMakeUserActive(){
//鉴于:
最终用户实体用户实体=新用户实体();
//模拟:
when(repository.findById(1)).thenReturn(可选的(userEntity));
//当:
service.makeUserActive(1);
//然后:
验证(存储库).findById(1);
验证(存储库)。保存(用户实体);
}
}

对于返回
void
的方法,您只需验证它们是否已被调用即可。下面是一个模拟对象返回方法和
void
返回方法的示例

@ExtendWith(MockitoExtension.class)
类服务测试{
@嘲弄
私有存储库;
@注射模拟
私有服务;//假设这是您的类
@试验
void testMakeUserActive(){
//鉴于:
最终用户实体用户实体=新用户实体();
//模拟:
when(repository.findById(1)).thenReturn(可选的(userEntity));
//当:
service.makeUserActive(1);
//然后:
验证(存储库).findById(1);
验证(存储库)。保存(用户实体);
}
}

问题是你想测试什么? 如果您想测试存储库,可以使用Springs
@DataJpaTest
实现这一点。看

如果要测试
makeUserActive
-方法中的逻辑,必须确保模拟存储库

假设包含
makeUserActive
-方法的服务如下所示:

public class UserService{

    private final UsersJpaRepository usersJpaRepository;

    public UserService(UsersJpaRepository usersJpaRepository) {
        this.usersJpaRepository = usersJpaRepository;
    }

    public void makeUserActive(long userId){
        // your code from your question

    }
}
@Test
void makeUserActiveTest(){
    UsersJpaRepository repository = new InMemoryUsersJpaRepository();
    UserEntity user = new UserEntity();
    user = repository.save(user);

    UserService service = new UserService(repository);

    service.makeUserActive(user.getId());

    Optional<UserEntity> activatedUser = repository.findById(user.getId());

    assertTrue(activatedUser.isPresent());
    assertEquals(1, activatedUser.get().isActive());
}
public class InMemoryUsersJpaRepository extends UsersJpaRepository {

    private Map<Long, UserEntity> users = new HashMap<>();
    private Long idCounter = 1L;

    @Override
    public UserEntity save(UserEntity user) {
        if(user.getId() == null){
            user.setId(idCounter);
            idCounter++;
        }

        users.put(user.getId(), user);

        return user;
    }

    @Override
    public Optional<UserEntity> findById(long userId) {
        return Optional.of(users.get(userId));
    }
}
您可以这样编写单元测试:

public class UserService{

    private final UsersJpaRepository usersJpaRepository;

    public UserService(UsersJpaRepository usersJpaRepository) {
        this.usersJpaRepository = usersJpaRepository;
    }

    public void makeUserActive(long userId){
        // your code from your question

    }
}
@Test
void makeUserActiveTest(){
    UsersJpaRepository repository = new InMemoryUsersJpaRepository();
    UserEntity user = new UserEntity();
    user = repository.save(user);

    UserService service = new UserService(repository);

    service.makeUserActive(user.getId());

    Optional<UserEntity> activatedUser = repository.findById(user.getId());

    assertTrue(activatedUser.isPresent());
    assertEquals(1, activatedUser.get().isActive());
}
public class InMemoryUsersJpaRepository extends UsersJpaRepository {

    private Map<Long, UserEntity> users = new HashMap<>();
    private Long idCounter = 1L;

    @Override
    public UserEntity save(UserEntity user) {
        if(user.getId() == null){
            user.setId(idCounter);
            idCounter++;
        }

        users.put(user.getId(), user);

        return user;
    }

    @Override
    public Optional<UserEntity> findById(long userId) {
        return Optional.of(users.get(userId));
    }
}
这样,您将测试
makeUserActive
-方法的逻辑,该方法当前只需在您的UserEntity上设置
isActivated
标志


我还想提醒你关于库拉米先生的问题。 他的答案中的代码将导致通过测试,但我很确定它不会测试您想要测试的东西。
您应该始终测试方法的预期和可观察行为。 在您的情况下,这将是
isActivated
标志,该标志应为1。

您的
makeUserActive
-方法调用
UsersJpaRepository
findById
save
方法这一事实仅仅是一个实现细节,对这些方法的测试通常会导致脆弱的测试。

问题是您想要测试的东西是什么? 如果您想测试存储库,可以使用Springs
@DataJpaTest
实现这一点。看

如果要测试
makeUserActive
-方法中的逻辑,必须确保模拟存储库

假设包含
makeUserActive
-方法的服务如下所示:

public class UserService{

    private final UsersJpaRepository usersJpaRepository;

    public UserService(UsersJpaRepository usersJpaRepository) {
        this.usersJpaRepository = usersJpaRepository;
    }

    public void makeUserActive(long userId){
        // your code from your question

    }
}
@Test
void makeUserActiveTest(){
    UsersJpaRepository repository = new InMemoryUsersJpaRepository();
    UserEntity user = new UserEntity();
    user = repository.save(user);

    UserService service = new UserService(repository);

    service.makeUserActive(user.getId());

    Optional<UserEntity> activatedUser = repository.findById(user.getId());

    assertTrue(activatedUser.isPresent());
    assertEquals(1, activatedUser.get().isActive());
}
public class InMemoryUsersJpaRepository extends UsersJpaRepository {

    private Map<Long, UserEntity> users = new HashMap<>();
    private Long idCounter = 1L;

    @Override
    public UserEntity save(UserEntity user) {
        if(user.getId() == null){
            user.setId(idCounter);
            idCounter++;
        }

        users.put(user.getId(), user);

        return user;
    }

    @Override
    public Optional<UserEntity> findById(long userId) {
        return Optional.of(users.get(userId));
    }
}
您可以这样编写单元测试:

public class UserService{

    private final UsersJpaRepository usersJpaRepository;

    public UserService(UsersJpaRepository usersJpaRepository) {
        this.usersJpaRepository = usersJpaRepository;
    }

    public void makeUserActive(long userId){
        // your code from your question

    }
}
@Test
void makeUserActiveTest(){
    UsersJpaRepository repository = new InMemoryUsersJpaRepository();
    UserEntity user = new UserEntity();
    user = repository.save(user);

    UserService service = new UserService(repository);

    service.makeUserActive(user.getId());

    Optional<UserEntity> activatedUser = repository.findById(user.getId());

    assertTrue(activatedUser.isPresent());
    assertEquals(1, activatedUser.get().isActive());
}
public class InMemoryUsersJpaRepository extends UsersJpaRepository {

    private Map<Long, UserEntity> users = new HashMap<>();
    private Long idCounter = 1L;

    @Override
    public UserEntity save(UserEntity user) {
        if(user.getId() == null){
            user.setId(idCounter);
            idCounter++;
        }

        users.put(user.getId(), user);

        return user;
    }

    @Override
    public Optional<UserEntity> findById(long userId) {
        return Optional.of(users.get(userId));
    }
}
这样,您将测试
makeUserActive
-方法的逻辑,该方法当前只需在您的UserEntity上设置
isActivated
标志


我还想提醒你关于库拉米先生的问题。 他的答案中的代码将导致通过测试,但我很确定它不会测试您想要测试的东西。
您应该始终测试方法的预期和可观察行为。 在您的情况下,这将是
isActivated
标志,该标志应为1。
您的
makeUserActive
-方法调用
UsersJpaRepository
findById
save
方法,这只是一个实现细节,对这些方法的测试通常会导致脆弱的测试