【问题标题】:Lenient string matching with Mockito Mock与 Mockito Mock 匹配的宽松字符串
【发布时间】:2019-10-05 01:22:14
【问题描述】:

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

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

【问题讨论】:

    标签: java mockito junit5


    【解决方案1】:

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

    您要么必须升级,要么使用other way 来写这个:

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

    【讨论】:

    • 你不能使用lenient().given().willReturn()。 Lenient 仅适用于非 BDD 语法。 lenient().when().thenReturn()
    • @mend:你说得对,我调整了答案。即使是现在,相关的feature request 似乎也没有进入任何版本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    • 2018-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多