首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java 8函数中的运行时异常

Java 8函数中的运行时异常
EN

Stack Overflow用户
提问于 2019-11-22 16:21:11
回答 1查看 112关注 0票数 0

我使用Java 8函数和转换器,并具有以下功能:

主类

代码语言:javascript
运行
复制
public final class MainClass {
    public MainClass(
            final Function<InputModel, OutputModel> businessLogic,
            final Converter<Input, InputModel> inputConverter,
            final Converter<OutputModel, Output> outputConverter) {
        this.businessLogic = requireNonNull(businessLogic, "businessLogic is null.");
        this.inputConverter = requireNonNull(inputConverter, "inputConverter is null.");
        this.outputConverter = requireNonNull(outputConverter, "outputConverter is null.");
    }

    /**
     * Request Handler.
     */
    public Output handleRequest(final Input input) {
        requireNonNull(input, "input is null.");

        log.info("input request: {}", input);

        try {
            return inputConverter
                    .andThen(businessLogic)
                    .andThen(outputConverter)
                    .apply(input);
        } catch (final Exception ex) {
            throw new InternalServiceException(ex.getMessage(), ex);
        }
    }
}

单元测试

代码语言:javascript
运行
复制
public final class TestClass {

    @Mock
    private Function<InputModel, OutputModel> mockedBusinessLogic;

    @Mock
    private Converter<Input, InputModel> mockedInputConverter;

    @Mock
    private Converter<OutputModel, Output> mockedOutputConverter;

    private MainClass mainClass = new MainClass(mockedBusinessLogic, mockedInputConverter, mockedOutputConverter);

    @Test
    public void handleRequest_SHOULD_throwException_WHEN_inputConverter_throwsException() {
        final RuntimeException inputConverterException = new NullPointerException(EXCEPTION_MESSAGE);

        // what should I mock here? apply or convert.. apply for `Converter` seems to be deprecated.
        when(mockedInputConverter.convert(input))
                .thenThrow(inputConverterException);

        final Exception exception = assertThrows(
                InternalServiceException.class,
                () -> mainClass.handleRequest(input)
        );

        assertThat(exception.getMessage(), is(EXCEPTION_MESSAGE));
        assertThat(exception.getCause(), is(inputConverterException));
    }
}

上述断言都失败了。我希望如果inputConverter抛出一个异常,handleRequest中的catch块会将它包装成InternalServiceException,但它似乎没有发生。

有什么帮助吗?我如何实际为handleRequest方法编写单元测试?我想测试inputConveterbusinessLogicoutputConveter中的任何一个抛出异常时的行为。

EN

回答 1

Stack Overflow用户

发布于 2019-11-22 17:42:36

代码中的所有内容都是一个模拟。当您在模拟的andThen上调用inputConverter时,将返回null或新的模拟实例(取决于配置)。每个andThen将返回一个带有链式转换器的新实例(至少这是我假设的)。

确保您模拟所有必需的方法,或者更好地使用从实类实例化的真实对象。

设置断点,然后进行调试,会帮助您找到问题。如果您在try-块中设置,然后单步遍历代码,您将看到代码中使用模拟的方式将无法工作。您还可以将andThen的每个结果保存在变量中,然后在调试器中签入每个结果的类型。我很肯定它会是null或者是“X类的伪装”。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58998090

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档