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));
}