这是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,并且id
是private
,因此没有“合法”方式写入它。
有一种简单的 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/