4

テストでプライベート メソッドをモックするために PowerMockito を使用しています。

validator = spy(new CommentValidator(form, request));
PowerMockito.when(
        validator,
        method(CommentValidator.class, "isCaptchaValid",
        HttpServletRequest.class))
    .withArguments(Mockito.any())
    .thenReturn(true);

テストを実行すると、メソッドの 2 行目java.lang.reflect.InvocationTargetExceptionに a が表示されます。これは次のようになります。NullPointerExceptionisCaptchaValid

private boolean isCaptchaValid(HttpServletRequest request) {
    Captcha captcha =
        (Captcha) request.getSession().getAttribute("attribute");
    if (captcha == null) {
        log.debug(String.format("O valor do captcha da sessão esta nulo. IP: [%s]",
            IPUtil.getReaderIp(request)));
        return false;
    }
    if (captcha.isInputValid(
            request.getParameter("captcha").toString().toUpperCase())) {
        return true;
    }
    return false;
}

public final Boolean isInputValid(String pInput) {

    if (getPuzzle() == null) {
        if (LOGGER.isDebugEnabled()) {
            LOGGER.debug("puzzle is null and invalid. Will return Boolean.FALSE");
        }
        return Boolean.FALSE;
    }

    Boolean returnValue = verifyInput(pInput);
    if (LOGGER.isDebugEnabled()) {
        LOGGER.debug("Validation of puzzle: " + returnValue);
    }
    disposePuzzle();

    return returnValue;
}

メソッドの動作をモックしているのに、メソッドの実装が考慮されるのはなぜですか? それを回避する方法はありますか?Captchaモックする必要があるのは、オブジェクトを提供できないためです。

4

1 に答える 1

2

問題が解決しました

電話することで

PowerMockito.when(
        validator,
        method(CommentValidator.class, "isCaptchaValid",
        HttpServletRequest.class))
    .withArguments(Mockito.any())
    .thenReturn(true);

まず、メソッド自体が検証されるPowerMockitoためNPE、見つかる可能性が非常に高くなります。

それを避けるには、そのロジックを逆にする必要があります。

doReturn(true).when(validator, "isCaptchaValid", any(HttpServletRequest.class));

メソッドの本体をPowerMockito無視して、すぐに必要なものを返します。

于 2015-06-16T14:14:05.597 に答える