gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:32:23 29 4
gpt4 key购买 nike

这是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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com