如何为单元测试设置 AccessLevel.NONE 的 JPA 属性?

How to set JPA attribute with AccessLevel.NONE for unit test?

这是 User 实体 class:

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

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

这是 UserServiceTest class:

@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 的字段?

如果您需要从客户端以单一方式设置该字段,为什么要使用:AccessLevel.NONE? 这是矛盾的,因为它意味着:don't generate anything

public static final AccessLevel NONE

Represents not generating anything or the complete lack of a method.

关于:

I want to set the id of mockUser but it can't access. Is there a solution to set the field with AccessLevel.NONE ?

为此注释写一个 setter 或删除。 为了您的应用程序,不要对这种事情使用反射。

是的,有,但它涉及反思。如前所述,@Setter(AccessLevel.NONE) 表示没有 setter,而 idprivate,因此没有“合法”的方式写入它。

有一个简单的 Java 方法,但由于您已经在使用 Spring,我建议 ReflectionTestUtils,这样使用:

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

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