我试图实现Mockito来测试特定的方法,但是.thenReturn(...)似乎总是返回一个null对象,而不是我想要的:
我正在使用mockito 2.22.0和Junit-5以及spring 2.0.4。
用户resultUser=userService.save(userDto);上面的行返回始终为空指针exception.not,确定为什么resultUser总是重设null,
我的考试课
@SpringBootTest
public class UserServiceTests {
@InjectMocks
private UserService userService =new UserServiceImpl();
@Mock
private UserRepository userRepository;
@Mock
BCryptPasswordEncoder passwordEncoder;
@BeforeEach
void setUp() throws Exception{
MockitoAnnotations.initMocks(this);
}
@DisplayName("Test saveRegistrationTest method making call to Repository")
@Test
public void saveRegistrationTest() {
User user =new User();
user.setFirstName("TestFN");
user.setLastName("TestLN");
user.setEmail("test@test.com");
user.setPassword("7asdf7asdfi");
User testUser =new User();
testUser.setFirstName("TestFN");
UserRegistrationDto userDto = new UserRegistrationDto();
userDto.setFirstName("TestFN");
when(userRepository.save(testUser )).thenReturn(user);
**User resultUser=userService.save(userDto);**
String firstName=(userService.save(userDto)).getFirstName();
String lastName=(userService.save(userDto)).getLastName();
String resultEmailFromRepo=(userService.save(userDto)).getEmail();
String password=(userService.save(userDto)).getPassword();
assertNotNull(user);
assertEquals("TestLN", firstName);
assertEquals("TestLN", lastName);
assertEquals("test@test.com", resultEmailFromRepo);
assertNotNull(password);
assertEquals("7asdf7asdfi", password);
}用户实体
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String firstName;
private String lastName;
private String email;
private String password;
@OneToMany(cascade = CascadeType.ALL)
private List<Todo> todoList = new ArrayList<>();
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinTable(
name = "users_roles",
joinColumns = @JoinColumn(
name = "user_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(
name = "role_id", referencedColumnName = "id"))
private Collection<Role> roles;UserDTO
public class UserRegistrationDto {
@NotEmpty
private String firstName;
@NotEmpty
private String lastName;
@NotEmpty
private String password;
@NotEmpty
private String confirmPassword;
@Email
@NotEmpty
private String email;
@Email
@NotEmpty
private String confirmEmail;
@AssertTrue
private Boolean terms;Userserviceimpl类
public User save(UserRegistrationDto registration){
User user = new User();
user.setFirstName(registration.getFirstName());
user.setLastName(registration.getLastName());
user.setEmail(registration.getEmail());
user.setPassword(passwordEncoder.encode(registration.getPassword()));
user.setRoles(Arrays.asList(new Role("TEST_USER")));
user.setTodoList(null);
return userRepository.save(user);
}发布于 2021-12-30 16:10:44
别
@InjectMocks
private UserService userService = new UserServiceImpl();这个“对象”从来不是由spring来管理的!
最好的
@SpringBootTest
class UserServiceTest {
@Autowired
private UserService testee;
@MockBean
private UserRepository userRepoMock; // done!
// ... many test methods, like: when(userRepoMock.xxx).thenYYY
// testee.someMethod()
// verify(userRepoMock...)
// ...
}该服务的内容如下:
@Service // or some other "spring managed bean"
public class UserService {
@Autowired
private UserRepository userRepository;
...
}正如约翰斯所言:
@BeforeEach不需要(但不有害?!)在这种情况下。
核心问题
当我们使用一个具体的对象实例作为mockito的“参数匹配器”时:
when(userRepository.save(someObject)).thenReturn(someMock);,我们应该确保,当(在测试期间):
userRepository(someOtherObject)..is打电话来,
someObject.equals(someOtherObject)..。是true!(“平等匹配者”)
否则mockito can‘/将不匹配该调用。
我们可以通过(自定义) equals (和hashCode)方法来解析:
// e.g. with lombok:
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
// ...
class UserRegistrationDto {
@EqualsAndHashCode.Include
String name;
}EqualsAndHashCode(推荐的,但要做好!)(lombok小字,或手册!)
或者使用“更广泛的论据匹配器”,比如:
when(userRepository.save(any(UserRegistrationDto.class)).thenReturn(myMockResponse);..or甚至:
when(userRepository.save(any(/*java.lang.Object*/))...https://stackoverflow.com/questions/70533169
复制相似问题