与 Mockito Mock 匹配的宽松字符串

Lenient string matching with Mockito Mock

我有一个测试来验证空对象的 return 如果该对象的字符串 属性 与预定值不匹配。我的密码是

import guru.springframework.sfgpetclinic.model.Speciality;
import guru.springframework.sfgpetclinic.repositories.SpecialtyRepository;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;

import java.util.Optional;

import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.BDDMockito.*;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.BDDMockito.given;
import static org.mockito.BDDMockito.then;

@ExtendWith(MockitoExtension.class)
class SpecialtySDJpaServiceTest {

    @Mock
    SpecialtyRepository specialtyRepository;

    @InjectMocks
    SpecialtySDJpaService service;


    @Test
    void testSaveLambdaNoMatch() {

       // Given
       final String MATCH_ME = "MATCH_ME";
       Speciality speciality = new Speciality();
       speciality.setDescription("Not a match");

       Speciality savedSpeciality = new Speciality();
       savedSpeciality.setId(1L);

       // Need mock to only return on match MATCH_ME string
       given(specialtyRepository.save(argThat(argument -> argument.getDescription().equals(MATCH_ME)))).willReturn(savedSpeciality);

       // When
       Speciality returnedSpeciality = service.save(speciality);

       // Then
       assertNull(returnedSpeciality);

    }

   // Other tests...

}

此测试失败并显示消息

org.mockito.exceptions.misusing.PotentialStubbingProblem: 
Strict stubbing argument mismatch. Please check:
- this invocation of 'save' method:
specialtyRepository.save(
guru.springframework.sfgpetclinic.model.Speciality@19ae6bb

我认为问题在于 argThat() 使用了精确匹配方案。我想通过

将模拟匹配设置为宽松
@Mock(lenient = true)
SpecialtyRepository specialtyRepository 

但是Intellij不识别lenient参数。我正在使用 JUnit 5 和 Mockito 2.23.0

@Mock(lenient = true) 在 Mockito 版本 2.23.3 中引入。

你要么必须升级要么使用other way写这个:

lenient().when(specialtyRepository.save(argThat(argument -> argument.getDescription().equals(MATCH_ME)))).willReturn(savedSpeciality);