简体   繁体   English

Mockito 然后总是返回 null, Spring-Boot + Junit5 + Z4D1142CA816EAC3E333B383BC0B7B9

[英]Mockito thenReturn always null , Spring-Boot + Junit5 + Mockito

I'm trying to implement Mockito to test a particular method but the .thenReturn(...) seems to always be returning a null object instead of what I intended:我正在尝试实现 Mockito 来测试特定方法,但.thenReturn(...)似乎总是返回null object 而不是我想要的:

User resultUser=userService.save(userDto);用户结果User=userService.save(userDto); The above line return always nullpointer exception.not sure why resultUser always retuning null,上面的行总是返回空指针异常。不确定为什么 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);
}

Don't

@InjectMocks
private UserService userService = new UserServiceImpl();

Just只是

@SpringBootTest
//...
  @InjectMocks
  private UserService userService; // done!

When we use a concrete object instance as "argument matcher" for mockito:当我们使用具体的 object 实例作为 mockito 的“参数匹配器”时:

when(userRepository.save(someObject)).thenReturn(someMock);

, we should ensure, that when (during test): ,我们应该确保,当(在测试期间):

userRepository(someOtherObject)

..is called, ..叫做,

someObject.equals(someOtherObject)

... is true !("Equality Matcher") ...是true !(“平等匹配器”)

Otherwise mockito can'/won't match that invocation.否则 mockito 不能/不会匹配该调用。

We can resolve by, implementing (custom) equals (and hashCode ) methods:我们可以通过实现(自定义) equals (和hashCode )方法来解决:

// e.g. with lombok:
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
// ...
class UserRegistrationDto {
  @EqualsAndHashCode.Include
  String name;
}

EqualsAndHashCode (Recommended, but do it well, (lombok small print, or manual!)) EqualsAndHashCode (推荐,但要做好,(lombok小字,或手动!))


Or by using a "wider Argument Matcher", like:或者通过使用“更广泛的参数匹配器”,例如:

when(userRepository.save(any(UserRegistrationDto.class)).thenReturn(myMockResponse);

..or even: ..甚至:

when(userRepository.save(any(/*java.lang.Object*/))...

ArgumentMatchers javadoc ArgumentMatchers javadoc

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM