1

我的代码中基于带有 randomUUID 的 Spring IntegrationenrichHeader有以下定义:

@Bean
public Consumer<HeaderEnricherSpec> uriHeaderEnricher() {
    return new Consumer<HeaderEnricherSpec>() {
        private final String TIMESTAMP = "Timestamp";
        private final String MESSAGE_ID = "MessageId";

    @Override
        public void accept(HeaderEnricherSpec t) {
            t.headerFunction(MarklogicMessageHandler.URI, 
                    m -> "/event/" +
                         format(m.getHeaders().get(TIMESTAMP)) + "/" +
                         m.getHeaders().get(MESSAGE_ID) +
                         ".xml");
        }

        private String format(Object object) {
            if (!(object instanceof String)) {
                return "";
            }
            String string = (String) object;
            return string.substring(0, 10).replaceAll("-", "/");
        }

    };
}

我有点受阻,尽管对此代码的单元测试会是什么样子。有什么建议么?

4

1 回答 1

2

因此,在这种情况下,我们希望隔离被测类Consumer<HeaderEnricherSpec>并断言该类与其他类的任何和所有交互HeaderEnricherSpec。我不确定你是否使用了像 Mockito 这样的模拟框架,但我可以在 Mockito 中给你一个例子来说明如何很好地测试它。有趣的是使用 anArgumentCaptor来捕获发送到的 lambda headerFunction,然后您可以在测试中调用该 lambda 以确保它按预期工作。

//This should invoke your bean method
@Autowired
private Consumer<HeaderEnricherSpec> consumer;

@Captor
private ArgumentCaptor<Function<WhateverTypeMIs, String>> lambdaCaptor; 

@Test
public void testAccept() {
    HeaderEnricherSpec spec = Mockito.mock(HeaderEnricherSpec.class);

    consumer.accept(spec);

    // Just showing you how to use the captor, don't forget to test URI
    verify(spec).headerFunction(any(), lambdaCaptor.capture());

    //This will be the lambda function you passed to `headerFunction`
    Function<WhateverTypeMIs, String> lambda = lambdaCaptor.getValue();

    //Now you need to call the lambda function just like you would if it were a separately testable function.
    String result = lambda.apply(m);
    //assertions on result string based on m input
}

如果您需要更多帮助或指导,请告诉我。

有关 ArgumentCaptor 的更多信息:文档StackOverflow 答案

使用 ArgumentCaptor 作为字段

于 2017-06-12T22:16:00.237 回答