【Java】JUnit、ObjectMapper をモック化して例外を発生させる

ObjectMapperをJUnit でテストする際に、例外 (JsonProcessingException / IOException等) をモックで発生させたい場合は、ObjectMapper をモック化して例外をスローさせるようにすればできます

以下に Mockito を使った実装例を紹介します
(writeValueAsStringを例で実装紹介します)

■ テスト対象クラス

import com.fasterxml.jackson.databind.ObjectMapper;

public class MyService {
    private final ObjectMapper objectMapper;

    public MyService(ObjectMapper objectMapper) {
        this.objectMapper = objectMapper;
    }

    public String convertToJson(Object obj) {
        try {
            return objectMapper.writeValueAsString(obj);
        } catch (Exception e) {
            throw new RuntimeException("JSON変換失敗", e);
        }
    }
}

■ JUnitテストクラス

例外をモックでスローします

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;

public class MyServiceTest {

    @Test
    void testWriteValueAsStringThrowsException() throws JsonProcessingException {
        // Arrange
        ObjectMapper mockObjectMapper = mock(ObjectMapper.class);
        MyService service = new MyService(mockObjectMapper);

        Object input = new Object();

        // JsonProcessingException をスローするよう設定
        when(mockObjectMapper.writeValueAsString(input))
                .thenThrow(new JsonProcessingException("Mocked Exception") {});

        // Act & Assert
        RuntimeException exception = assertThrows(RuntimeException.class, () -> {
            service.convertToJson(input);
        });

        assertTrue(exception.getMessage().contains("JSON変換失敗"));
    }
}

【Spring Boot版】

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;

import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;

@SpringBootTest
class MyServiceTest {

    @Autowired
    private MyService myService;

    @MockBean
    private ObjectMapper objectMapper;

    @Test
    void testWriteValueAsStringThrowsException() throws JsonProcessingException {
        // Arrange
        Object input = new Object();

        // JsonProcessingException をモックでスロー
        when(objectMapper.writeValueAsString(input))
            .thenThrow(new JsonProcessingException("モック例外") {});

        // Act & Assert
        RuntimeException thrown = assertThrows(RuntimeException.class, () -> {
            myService.convertToJson(input);
        });

        assertTrue(thrown.getMessage().contains("JSON変換失敗"));
    }
}

是非ご参考ください

是非フォローしてください

最新の情報をお伝えします