如何为单元测试设置 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,而 id
是 private
,因此没有“合法”的方式写入它。
有一个简单的 Java 方法,但由于您已经在使用 Spring,我建议 ReflectionTestUtils
,这样使用:
ReflectionTestUtils.setField(user, "id", 42);
PS 1:您确实不应该使用 int
作为 id
的类型,而应使用 Integer
。否则,无法区分新实体和 id
为零的实体。
PS 2:你的 mockUser
不是模拟的。
这是 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,而 id
是 private
,因此没有“合法”的方式写入它。
有一个简单的 Java 方法,但由于您已经在使用 Spring,我建议 ReflectionTestUtils
,这样使用:
ReflectionTestUtils.setField(user, "id", 42);
PS 1:您确实不应该使用 int
作为 id
的类型,而应使用 Integer
。否则,无法区分新实体和 id
为零的实体。
PS 2:你的 mockUser
不是模拟的。