Wanted but not invoked: modelMapper.map() Actually, there were zero interactions with this mock. Java

47 views Asked by At

I get the error Wanted but not invoked: modelMapper.map() Actually, there is no interaction with this mock when writing the unit test of the saveColor method, even though I have mocked the modelMapper.

Service

@Service
public class ColorMasterImpl implements ColorMaster {

    private final ColorRepository colorRepository;

    public ColorMasterImpl(ColorRepository colorRepository) {
        this.colorRepository = colorRepository;
    }

    @Override
    public Color saveColor(Color color) {
        Color newColor = new Color(color.getId(), color.getName(), color.getHex());
        return colorRepository.save(newColor);
    }

Controller

@RestController
@RequestMapping("/api")
public class ColorMasterController {
    private final ColorMaster colorMaster;
    @Autowired
    private ModelMapper modelMapper;
    @Autowired
    public ColorMasterController(ColorMaster colorMaster, ModelMapper modelMapper) {
        this.colorMaster = colorMaster;
        this.modelMapper = modelMapper;
    }

    @PostMapping(path = "/color",consumes = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<Color> saveColor(@Valid @RequestBody ColorDTO colorDTO, BindingResult bindingResult){

        // ukt mengambil error di field mana yg salah
        List<FieldError> errors = bindingResult.getFieldErrors();
        if (!errors.isEmpty()){
            errors.forEach(fieldError ->{
                System.out.println(fieldError.getField() + " :" + fieldError.getDefaultMessage());
            } );
            return ResponseEntity.status(HttpStatus.BAD_REQUEST).build();
        }

        // jika tidak ada error
        Color color = modelMapper.map(colorDTO, Color.class);
        Color savedColor = colorMaster.saveColor(color);
        return ResponseEntity.status(HttpStatus.CREATED).body(savedColor);
    }

I've looked into the error message, and I'm unsure how to resolve this issue. Here's the relevant code:

@SpringBootTest
@ExtendWith(MockitoExtension.class)
@AutoConfigureMockMvc
//@WebMvcTest(ColorMasterController.class)
public class ColorMasterControllerTest {

    @Autowired
    private MockMvc mockMvc;
    @Autowired
    private ObjectMapper objectMapper;
    @Mock
    private ModelMapper modelMapper;
    @MockBean
    private ColorMaster colorMaster;

    @Test
    void savedColor_ValidInput_ReturnCreated() throws Exception {
       
        ColorDTO colorDTO = new ColorDTO(1L, "red", "1##r");
        Color color = new Color(1L, "red", "1##r");

        when(modelMapper.map(colorDTO, Color.class)).thenReturn(color);
        when(colorMaster.saveColor(any(Color.class))).thenReturn(color);

        MvcResult result = mockMvc.perform(post("/api/color")
                .contentType(MediaType.APPLICATION_JSON)
                .content(objectMapper.writeValueAsString(colorDTO)))
                .andExpect(status().isCreated())
                // andReturn() :mengembalikan hasil dari permintaan sebagai objek MvcResult.
                // Objek ini berisi informasi tentang respons, seperti status, header, dan isi.
                .andReturn();
       
        verify(modelMapper, times(1)).map(colorDTO, Color.class);
        verify(colorMaster, times(1)).saveColor(any(Color.class));
        then(result.getResponse().getContentAsString()).isEqualTo(objectMapper.writeValueAsString(color));
    }
0

There are 0 answers