Home > database >  Why lenient solves Unneccessary Stubbing exception in given example
Why lenient solves Unneccessary Stubbing exception in given example

Time:12-08

I have read previous questions but there is not exact answer pointing my questions directly. My code is below:

@Service
@RequiredArgsConstructor
public class CityServiceImpl implements CityService {
    private final CityRepository cityRepo;
    private final CityMapper cityMapper;
@Override
public CityDto findById(Integer id) {
    City city = cityRepo.findById(id)
            .orElseThrow(() -> new NotFoundException(NotFoundException.Domain.CITY));
    return CityMapper.INSTANCE.cityToCityDto(city);

 }
}

My test class is as below:

@ExtendWith(MockitoExtension.class)
public class CityServiceTest {
  @Mock
  CityRepository cityRepository;

  @Mock
  CityMapper cityMapper;

  @InjectMocks
  CityServiceImpl cityService;
  City city;

  @BeforeEach
  public void init() {
    city = new City();
  }
  @Test
  void findById_Success() {
    Integer given = 1;

    CityDto expected = new CityDto();

    when(cityRepository.findById(1)).thenReturn(Optional.of(city));
    when(cityMapper.cityToCityDto(city)).thenReturn(expected);

    CityDto actual = cityService.findById(given);

    assertEquals(expected, actual);

  }
}

I got an error pointing to this line

when(cityMapper.cityToCityDto(city)).thenReturn(expected);

Unnecessary stubbings detected. Clean & maintainable test code requires zero unnecessary code. Following stubbings are unnecessary

I got an aswer that when i use lenient.when(cityMapper.cityToCityDto(city)).thenReturn(expected); or annotation of lenient works fine. But what is the logic behind it.

Why lenient solves Unneccessary Stubbing exception in given example?

CodePudding user response:

The real dependency is CityMapper cityMapper. In findById_Success you are calling

cityMapper.cityToCityDto(city)

But, if you see the real method is not calling that . Instead

CityMapper.INSTANCE.cityToCityDto(city)

has been used. Change any of them, it should work

CodePudding user response:

It looks like your mocked cityMapper is never being used, that’s why you see the exception.

Replace CityMapper.INSTANCE with cityMapper in the findById method and the UnnecessaryStubbingException should go away. If your code still does what it should, however, I cannot decide from what I see.

  • Related