Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.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

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 如何使用AccessLevel.NONE为单元测试设置JPA属性?_Java_Spring Boot_Junit_Lombok - Fatal编程技术网

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);