Java 如何使用AccessLevel.NONE为单元测试设置JPA属性?
这是用户实体类:Java 如何使用AccessLevel.NONE为单元测试设置JPA属性?,java,spring-boot,junit,lombok,Java,Spring Boot,Junit,Lombok,这是用户实体类: @NoArgsConstructor @Data @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Setter(AccessLevel.NONE) private int id; @Column(nullable = false) private String name; } 这是UserServiceTe
@NoArgsConstructor
@Data
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Setter(AccessLevel.NONE)
private int id;
@Column(nullable = false)
private String name;
}
这是UserServiceTest类:
我想设置mockUser的id,但无法访问它。是否有解决方案来设置具有AccessLevel.NONE的字段?如果需要从客户端以统一方式设置该字段,为什么要使用:AccessLevel.NONE? 这是矛盾的,因为它的意思是: 公共静态最终访问级别无 表示未生成任何内容或完全缺少方法 关于: 我想设置mockUser的id,但它无法访问。有没有 将字段设置为AccessLevel.NONE的解决方案 编写或删除此批注的setter。
为了您的应用程序,不要在这样的事情上使用反射 是的,有,但它涉及反射。如前所述,@SetterAccessLevel.NONE意味着没有setter,id是私有的,因此没有“合法”的写入方式 有一种简单的Java方式,但由于您已经在使用Spring,我建议您使用ReflectionTestUtils,如下所示:
ReflectionTestUtils.setField(user, "id", 42);
PS 1:您确实不应该使用int作为id的类型,而应该使用Integer。否则,无法区分新实体和id为零的实体。
PS 2:您的mockUser不是mock。您可能希望将其改为@SetterAccessLevel.PACKAGE。这使得它可以用于同一个包中的代码,包括您的单元测试。不需要这样做,对于JPA生成的id,我不建议使用它。@Roel Spilker实体不一定在使用该UserService的类的包中。@Michael Piefel代码必须是自然可测试的,并且反射容易出错:出于公平的原因,我们希望使用它。可以更改JPA分配给实体的id的代码容易出错,也你就看着办吧
ReflectionTestUtils.setField(user, "id", 42);