Модульный тест для воспроизведения и тестирования сценария, который выдает исключение JsonProcessingException - PullRequest
0 голосов
/ 16 апреля 2019

У меня есть класс со следующим методом, для которого я хочу написать модульный тест:

public class Service {
    ..
    ..
    Test getTestObj(@NotNull Product product) {
        String prodJSON;
        try {
            prodJSON = Test.mapper.writeValueAsString(product);   // The class Test is defined as below and has the ObjectMapper property
            logger.info("product json", productJSON);
        } catch (JsonProcessingException e) {
            logger.error("...", e);
            ..
            throw new InternalServerErrorException("An error occured");
        }
        ...
        ...
    }
    ..
    ..
}


Test.java

public class Test {

    public static final ObjectMapper mapper = new ObjectMapper();
    ..
    ..
}   

Допустим, у меня есть класс Test (ServiceTest.java) для Service.java, где я хочунаписать модульный тест для метода Test getTestObj(@NotNull Product product) { В этом модульном тесте я в основном хочу охватить сценарий, в котором выбрасывается исключение JsonProcessingException.Итак, я хочу иметь возможность протестировать код:

} catch (JsonProcessingException e) {
            logger.error("...", e);
            throw new InternalServerErrorException("An error occured");
}

Допустим, я начинаю с моего ServiceTest.java

@Test
public void getTestObjTest() {
    Product prod = new Productt();
    service.getTestObj(prod);
}

Вышеупомянутый тест просто охватит счастливый путь, где JsonProcessingExceptionне брошен.Как я могу изменить свой тест, чтобы исключение JsonProcessingException вызывалось при вызове getTestObj?

Обратите внимание, что я не могу изменить классы Test.java и Service.java.Я могу изменить только мой тест

В моем тесте я вызываю метод как: service.getTestObj (prod);
Так что я должен передать действительный объект Product.И это никогда не вызовет JSONProcessingException.Есть ли способ манипулировать или сбрасывать значение prod (которое передается методу writeValueAsString) с помощью чего-то вроде new Object ()?

1 Ответ

0 голосов
/ 16 апреля 2019
public class Test {

    private static final ObjectMapper mapper = new ObjectMapper();
    ..
    ..

    public static ObjectMapper getMapper(){
     return mapper;
    }
} 



@RunWith(MockitoJUnitRunner.class)
public class JunitTest {

  @Mock
  private ObjectMapper mapper;

    @Test(expected=InternalServerErrorException.class)
    public void test(){
     Mockito.when(Test.getMapper()).thenReturn(mapper);
     Mockito.when(mapper.writeValueAsString(Mockito.any())).thenThrow(JsonProcessingException.class);

Service service = new Service();
service.getTestObj(new Product());

            }
        }
...