我用的是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
在我的实体里。为了实现这一点,我应该做些什么?
1条答案
按热度按时间0pizxfdo1#
您的测试失败,因为您保存的对象不等于初始化的对象。
Lombok岛
@Data
合并@ToString @EqualsAndHashCode @Getter @Setter
以及@RequiredArgsConstructor
如果没有指定任何参数,那么每个java类都有一个默认的no-args构造函数(如您所知)。当你要求考试的时候,你要求的是
getId()
在初始化为null
为了解决这个问题,你可以单独添加Lombok山@AllArgsConstructor
或者@RequiredArgsConstructor