java - 如何使用 AccessLevel.NONE 设置 JPA 属性进行单元测试?

标签 java spring-boot junit lombok

这是User实体类:

@NoArgsConstructor
@Data
@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Setter(AccessLevel.NONE)
    private int id;

    @Column(nullable = false)
    private String name;
}

这是UserServiceTest类:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = { UserService.class })
public class UserServiceTest {
    @Autowired
    UserService userService;

    @MockBean
    UserRepository userRepository;

    @Test
    public void testGetName() {
        int id = 2;
        User mockUser = new User();
        mockUser.setId(id)          // Error Here
        mockUser.setName("John");
        Optional<User> mockUserOptional = Optional.of(mockUser);
        Mockito.when(userRepository.findById(id)).thenReturn(mockUserOptional);
        ...
    } 
}

我想设置mockUser的id,但无法访问它。是否有解决方案来设置具有 AccessLevel.NONE 的字段?

最佳答案

是的,有,但它涉及反射(reflection)。如前所述,@Setter(AccessLevel.NONE) 意味着没有setter,并且idprivate,因此没有“合法”方式写入它。

有一种简单的 Java 方法,但由于您已经在使用 Spring,我建议使用 ReflectionTestUtils,如下所示:

ReflectionTestUtils.setField(user, "id", 42);

PS 1:您确实不应该使用 int 作为 id 的类型,而应该使用 Integer 来代替。否则,无法区分新实体和 id 为零的实体。 PS 2:您的 mockUser 不是模拟。

关于java - 如何使用 AccessLevel.NONE 设置 JPA 属性进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57851708/

相关文章:

java - ExpectedException 的原因是什么?

java - 线程在 JUnit 中表现异常

java - 将数据转换为 xml 时特殊字符被替换

java - Intellij Idea & SVN : How to add all new files on "Commit Directories"?

java - 如何将字符映射到java中的数字位置?

spring-boot - 在Spring Boot中使用不同的弹性指数进行测试

java - jaxws-ri 和 jaxws-rt 有什么区别?

maven - tomcat7-maven-plugin 部署 spring boot 并选择合适的 spring 配置文件

java - Cookie CsrfTokenRepository.withHttpOnlyFalse() 做什么以及何时使用它?

java - Mockito when().thenReturn 不必要地调用该方法