I have a class as shown below:
@Getter
@Setter
public class User{
@Autowired
Logger log;
private String name;
private String age;
public String toJson(){
ObjectMapper objectMapper = new ObjectMapper();
String jsonString = null;
try{
jsonString = objectMapper.writeValueAsString(this);
}catch(JsonProcessingException jsnEx){
log.writeErr(" Error while parsing the Json" jsnEx.getMessage());
}
return jsonString;
}
}
Now I am trying to write a unit test case for this where I can throw exception and unit test the catch clause using Mockito but I am not able to mock it. I have noticed that object mapper class internally converting everything to string even if I set name and age to null. Can anyone please help me with this?
CodePudding user response:
Use constructor injection with Spring. This will allow you to inject mocked ObjectMapper in the class, which then you can set behavior in the test. See below.
@Getter
@Setter
public class User{
private String name;
private String age;
private final Logger log;
private final ObjectMapper objectMapper;
public User(Logger log, ObjectMapper objectMapper){
this.log = log;
this.objectMapper = objectMapper;
}
public String toJson(){
String jsonString = null;
try{
jsonString = objectMapper.writeValueAsString(this);
}catch(JsonProcessingException jsnEx){
log.writeErr(" Error while parsing the Json" jsnEx.getMessage());
}
return jsonString;
}
}
// Test
@Before
public setup(){
@Mock
Logger log;
@Mock
ObjectMapper objectMapper;
testObject = new User(log, objectMapper);
}
@Test
public test_toJson(){
// given
when(objectMapper.writeValueAsString(any())).thenThrow(new JsonProcessingException("Fake exception"))
// when
testObject.toJson()
}
