unittest失败,使用lombok@getter和@setter时id为null,但在实体类上使用@data时有效

vngu2lb8  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(283)

我用的是Lombok山 @Getter 以及 @Setter 实体类上的注解。

import lombok.Getter;
import lombok.Setter;

@Entity
@Table(name = "Achievements")
@Getter
@Setter
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
public class Achievement extends DomainObject {

  private static final long serialVersionUID = 1L;

  @Column(name = "Name")
  private String name;

  @Column(name = "Details")
  private String details;

  @ManyToOne
  @JoinColumn(name = "AchievementTypeId", nullable = false)
  private AchievementType achievementType;

  @OneToMany(cascade = CascadeType.ALL)
  @JoinColumn(name = "QuestId")
  private Quest quest;
}

当我运行下面的单元测试时。它失败了:

@Test
  public void saveAchievementTest() {
    Achievement achievement = new Achievement();
    achievement.setId(UUID.fromString(achievementId));
    AchievementRequestDTO achievementRequestDTO = new AchievementRequestDTO();
    achievementRequestDTO.setAchievementTypeId(UUID.fromString(achievementTypeId));
    achievement.setAchievementType(achievementType);
    when(achievementTypeRepository.getOne(achievementRequestDTO.getAchievementTypeId()))
        .thenReturn(achievementType);
    when(achievementRepository.save(achievement)).thenReturn(achievement);
    Achievement dbAchievement = achievementService.saveAchievement(achievementRequestDTO);
    assertEquals(dbAchievement.getId(), UUID.fromString(achievementId));
  }

上述运行失败,出现错误 NullPointerException 声明 dbAchievement is null . 但是,当(在两种情况中的任何一种情况下)出现以下情况时,相同的测试用例也会起作用:
我用 @Data 注解而不是 @Getter 以及 @Setter 在实体类中。
我把测试中的when语句改为 when(achievementRepository.save(any())).thenReturn(achievement); 我想这里的问题是比较hashcode来比较传递的对象。我想坚持使用 @Getter and @Setter 在我的实体里。为了实现这一点,我应该做些什么?

0pizxfdo

0pizxfdo1#

您的测试失败,因为您保存的对象不等于初始化的对象。
Lombok岛 @Data 合并 @ToString @EqualsAndHashCode @Getter @Setter 以及 @RequiredArgsConstructor 如果没有指定任何参数,那么每个java类都有一个默认的no-args构造函数(如您所知)。
当你要求考试的时候,你要求的是 getId() 在初始化为 null 为了解决这个问题,你可以单独添加Lombok山 @AllArgsConstructor 或者 @RequiredArgsConstructor

相关问题