[英]Unit test fails with this.id is null when using lombok @Getter and @Setter, but works when using @Data on the Entity class
I am using lombok @Getter
and @Setter
annotations on my Entity class.我在我的实体类上使用@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;
}
When I run the following unit test.当我运行以下单元测试时。 it fails:它失败:
@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));
}
The above run fails with a NullPointerException
stating that dbAchievement is null
.上面的运行失败,出现NullPointerException
指出dbAchievement is null
。 However, the same test case works when(in either of the two cases):但是,相同的测试用例适用于(在两种情况中的任何一种情况下):
@Data
annotation instead of @Getter
and @Setter
in the entity class.我在实体类中使用@Data
批注而不是@Getter
和@Setter
。when(achievementRepository.save(any())).thenReturn(achievement);
我将测试中的when语句改为when(achievementRepository.save(any())).thenReturn(achievement);
I suppose the issue here is the comparison of hashcodes to compare the object passed.我想这里的问题是比较哈希码以比较传递的对象。 I want to stick to using @Getter and @Setter
in my entity.我想坚持在我的实体中使用@Getter and @Setter
。 What should I do differently to achieve this?我应该采取什么不同的方式来实现这一目标?
Your test fails because the object you save, doesn't equal the object initialized.您的测试失败,因为您保存的对象不等于初始化的对象。
Lombok's @Data
incorporates @ToString @EqualsAndHashCode @Getter @Setter
and @RequiredArgsConstructor
Lombok 的@Data
包含@ToString @EqualsAndHashCode @Getter @Setter
和@RequiredArgsConstructor
Every Java class has a default no-args constructor if there's none specified (as you have).如果没有指定(如您所见),则每个 Java 类都有一个默认的无参数构造函数。
When you call your test, you're calling for a getId()
on a field that's initialized as null
当您调用测试时,您是在初始化为null
的字段上调用getId()
To solve this, you can seperately add the Lombok @AllArgsConstructor
or the @RequiredArgsConstructor
要解决这个问题,您可以单独添加 Lombok @AllArgsConstructor
或@RequiredArgsConstructor
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.