@ControllerAdviceを使用した@RestControllerのテスト

パルス

私の問題は、@ ExceptionHandlerで@ControllerAdviceも使用しているSpring @ RestControllerのテストに関連しています。コードは次のとおりです。

@ControllerAdviceクラス:

@ControllerAdvice
public class MyAppExceptionHandler {

    @ExceptionHandler({ NoSuchEntityException.class })
    @ResponseStatus(value = HttpStatus.NOT_FOUND)
    public @ResponseBody
    ErrorDTO handleNotFoundException(Exception ex) throws IOException {

        return new ErrorDTO.Builder().setStatus(HttpStatus.NOT_FOUND)
                .setCause(ex.getClass().getName())
                .setThrowable(ex).build();
    }
}

アプリケーションで使用すると、すべてが正常に機能します。JSONの説明で404応答が完全に得られますが、テスト中に使用しようとすると、悪いことが起こります。

私のテストクラス:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { WebConfig.class })
@WebAppConfiguration
public class SomeTest {

    @Mock
    private SomeService service;

    @InjectMocks
    private SomeController controller;

    private MockMvc mvc;

    private ExceptionHandlerExceptionResolver createExceptionResolver() {
        ExceptionHandlerExceptionResolver exceptionResolver = new ExceptionHandlerExceptionResolver() {
            @Override
            protected ServletInvocableHandlerMethod getExceptionHandlerMethod(
                HandlerMethod handlerMethod, Exception exception) {
                Method method = new ExceptionHandlerMethodResolver(
                        MyAppExceptionHandler.class).resolveMethod(exception);
                return new ServletInvocableHandlerMethod(
                    new MyAppExceptionHandler(), method);
            }
        };
        exceptionResolver.afterPropertiesSet();
        return exceptionResolver;
    }

    @Before
    public void setup() {

        MockitoAnnotations.initMocks(this);
        mvc = MockMvcBuilders.standaloneSetup(controller)
                .setHandlerExceptionResolvers(createExceptionResolver())
                .build();
    }

    @Test
    public void thatExceptionHappens() throws Exception {

        when(service.get(10)).thenThrow(new NoSuchEntityException(Some.class, 10));

        mvc.perform(get("/api/some/10")).andExpect(status().isNotFound());
    }
}

それを実行しようとすると:

2014-07-15 19:35:01.376 [main] ERROR com.package.SomeTest$1 - Failed to invoke @ExceptionHandler method: public com.package.ErrorDTO com.package.MyAppExceptionHandler.handleNotFoundException(java.lang.Exception) throws java.io.IOException
org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation

@ExceptionHandlerのテスト中にMappingJackson2HttpMessageConverterがロードされていない可能性があります(ただし、WebConfig.classで構成されており、通常のテスト(例外をスローしないテスト)を実行しようとすると、すべて正常に機能します)。

よろしくお願いします。

デニスCデアゼベド

これがこれに対する最善の解決策で
あるかどうかはわかりませんが(別の解決策から聞きたいです)、これがあなたが直面しているこの問題を正確に修正する方法です:

この行をあなたのcreateExceptionResolver():に追加します

exceptionResolver.getMessageConverters().add(
        new MappingJackson2HttpMessageConverter());

このようなもの:

private ExceptionHandlerExceptionResolver createExceptionResolver() {
    ExceptionHandlerExceptionResolver exceptionResolver = new ExceptionHandlerExceptionResolver() {
        @Override
        protected ServletInvocableHandlerMethod getExceptionHandlerMethod(
            HandlerMethod handlerMethod, Exception exception) {
            Method method = new ExceptionHandlerMethodResolver(
                    MyAppExceptionHandler.class).resolveMethod(exception);
            return new ServletInvocableHandlerMethod(
                new MyAppExceptionHandler(), method);
        }
    };
    exceptionResolver.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
    exceptionResolver.afterPropertiesSet();
    return exceptionResolver;
}

なんらかの理由で、SpringはMappingJackson2HttpMessageConverterをロードしていませんでした
その行は私の問題を修正しました。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

@ControllerAdviceを使用した@RestControllerのテスト

分類Dev

RESTControllerの特定のパラメーターを使用したRestTemplateテスト

分類Dev

(コンテキスト)JUnit4とSpringを使用した@RestControllerテストの問題

分類Dev

Beans.xmlのルートコンテキストを使用したSpring @ RestControllerアノテーション

分類Dev

@RestControllerと@GetMappingを使用したAngularJsでのSpringブート

分類Dev

ResponseEntityを使用した@RestController

分類Dev

JUnitを使用したGUIのテスト

分類Dev

XCTestを使用したRACSignalsのテスト

分類Dev

MockRestServiceServerを使用したHttpRequestExecutingMessageHandlerのテスト

分類Dev

PowerMockRunnerを使用したLiveDataのテスト

分類Dev

Recomposeを使用したHOCのテスト

分類Dev

Jestを使用したLightningChartJSのテスト

分類Dev

Jasmineを使用したAngularqueryParamsのテスト

分類Dev

Robolectricを使用したAsyncTaskLoaderのテスト

分類Dev

gruntを使用したJavaScriptのテスト

分類Dev

Phantomjsを使用したAngularJSのテスト

分類Dev

RSpecを使用したRailsRESTAPIのテスト

分類Dev

phpunitを使用した例外のテスト

分類Dev

HPUFTを使用したvbscriptのテスト

分類Dev

Dockerを使用したMongoのテスト

分類Dev

Mockitoを使用した例外のテスト

分類Dev

HakyllのMonadMetadataを使用したテスト

分類Dev

PowerMockitoを使用したUnirestのテスト

分類Dev

Easymockを使用したケーステストのテスト

分類Dev

ControllerAdviceのExceptionHandlerを使用して、コントローラーのExceptionHandlerからスローされた例外を処理する方法は?

分類Dev

ControllerAdvice、ExceptionHandler、RestControllerのcatchブロックを試してください

分類Dev

XcodeUIテストを使用したUIWebViewのテスト

分類Dev

SpringアプリケーションでRestControllerとControllerを使用するためのベストプラクティス

分類Dev

Hibernateはクエリは@Transactionalコンテキストのうち、@RestControllerで実行しました

Related 関連記事

  1. 1

    @ControllerAdviceを使用した@RestControllerのテスト

  2. 2

    RESTControllerの特定のパラメーターを使用したRestTemplateテスト

  3. 3

    (コンテキスト)JUnit4とSpringを使用した@RestControllerテストの問題

  4. 4

    Beans.xmlのルートコンテキストを使用したSpring @ RestControllerアノテーション

  5. 5

    @RestControllerと@GetMappingを使用したAngularJsでのSpringブート

  6. 6

    ResponseEntityを使用した@RestController

  7. 7

    JUnitを使用したGUIのテスト

  8. 8

    XCTestを使用したRACSignalsのテスト

  9. 9

    MockRestServiceServerを使用したHttpRequestExecutingMessageHandlerのテスト

  10. 10

    PowerMockRunnerを使用したLiveDataのテスト

  11. 11

    Recomposeを使用したHOCのテスト

  12. 12

    Jestを使用したLightningChartJSのテスト

  13. 13

    Jasmineを使用したAngularqueryParamsのテスト

  14. 14

    Robolectricを使用したAsyncTaskLoaderのテスト

  15. 15

    gruntを使用したJavaScriptのテスト

  16. 16

    Phantomjsを使用したAngularJSのテスト

  17. 17

    RSpecを使用したRailsRESTAPIのテスト

  18. 18

    phpunitを使用した例外のテスト

  19. 19

    HPUFTを使用したvbscriptのテスト

  20. 20

    Dockerを使用したMongoのテスト

  21. 21

    Mockitoを使用した例外のテスト

  22. 22

    HakyllのMonadMetadataを使用したテスト

  23. 23

    PowerMockitoを使用したUnirestのテスト

  24. 24

    Easymockを使用したケーステストのテスト

  25. 25

    ControllerAdviceのExceptionHandlerを使用して、コントローラーのExceptionHandlerからスローされた例外を処理する方法は?

  26. 26

    ControllerAdvice、ExceptionHandler、RestControllerのcatchブロックを試してください

  27. 27

    XcodeUIテストを使用したUIWebViewのテスト

  28. 28

    SpringアプリケーションでRestControllerとControllerを使用するためのベストプラクティス

  29. 29

    Hibernateはクエリは@Transactionalコンテキストのうち、@RestControllerで実行しました

ホットタグ

アーカイブ