JUnit – Как имитировать вызов метода объекта локальной переменнойJAVA

Программисты JAVA общаются здесь
Ответить
Гость
 JUnit – Как имитировать вызов метода объекта локальной переменной

Сообщение Гость »

Код моего варианта использования приведен ниже:
Мой класс:

Код: Выделить всё

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class MyClass {
public String getString() {
// object need mocking
ObjectMapper mapper = new ObjectMapper()
try {
// method need mocking
return mapper.writeValueAsString(List.of("1", "2"));
}
catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
}
Тестовый код:

Код: Выделить всё

@Test
public void test_get_string() throws Exception {
ObjectMapper mapper = Mockito.mock(ObjectMapper.class);
Mockito.when(mapper.writeValueAsString(Mockito.anyList()))
.thenThrow(JsonProcessingException.class);

Assertions.assertThrows(RuntimeException.class, () -> {
new MyClass().getString();
});
// -> failed
// Expected RuntimeException but nothing was thrown
}
Я хочу издеваться над ObjectMapper и заставить его выдавать исключение JsonProcessingException при вызове метода writeValueAsString, но тест продолжает завершаться неудачно, как будто это не так. вообще используйте мой издевательский картограф. Но если я сделаю преобразователь свойством MyClass и имитирую его, тест пройдет.

Код: Выделить всё

public class MyClass {
// make mapper a property
private ObjectMapper mapper;

public MyClass(ObjectMapper mapper) {
this.mapper = mapper;
}

public String getString() {
try {
return mapper.writeValueAsString(List.of("1", "2"));
}
catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
}

Код: Выделить всё

@Test
public void test_get_string() throws Exception {
ObjectMapper mapper = Mockito.mock(ObjectMapper.class);
Mockito.when(mapper.writeValueAsString(Mockito.anyList()))
.thenThrow(JsonProcessingException.class);

Assertions.assertThrows(RuntimeException.class, () -> {
// pass mapper on creating object
new MyClass(mapper).getString();
}); // -> success
}
Если я не хочу делать картограф свойством моего класса, как мне правильно его издеваться?

Подробнее здесь: https://stackoverflow.com/questions/781 ... ethod-call
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»