如何在JUnit Test中看到Java ServiceActivator?

时间:2017-04-26 13:52:32

标签: java junit spring-integration

如何在JUnit Test中看到Java ServiceActivator?

我已经开始编写一个测试,它通过一些Java Config文件(即@ContextConfiguration中设置的文件)导入一些spring集成xmls。其中一个xml文件引用了一个名为 pollerErrorChannel 的通道,这是Java类中声明的ServiceActivator的输入通道。当测试开始时,我得到以下错误:

  

引起:org.springframework.beans.factory.BeanCreationException:创建名称为' sftpInboundAdapterBusiness'的错误:无法创建内部bean'(内部bean)#1fe8d51b'类型[org.springframework.integration.scheduling.PollerMetadata]设置bean属性' pollerMetadata&#39 ;;嵌套异常是org.springframework.beans.factory.BeanCreationException:创建名称为'(内部bean)的bean时出错#1fe8d51b':无法创建内部bean'(内部bean)#324dcd31'类型为[org.springframework.integration.channel.MessagePublishingErrorHandler]时设置bean属性' errorHandler&#39 ;;嵌套异常是org.springframework.beans.factory.BeanCreationException:创建名为'(内部bean)的bean时出错#324dcd31':无法解析对bean的引用' pollerErrorChannel'设置bean属性' defaultErrorChannel&#39 ;;嵌套异常是org.springframework.beans.factory.NoSuchBeanDefinitionException:没有名为' pollerErrorChannel'可用

在我的测试中

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {PropertySourcesPlaceholderConfigurer.class, 
    SFTPSampleReceiver.class,
    SampleIngestBusinessConfig.class, 
    SampleIngestConfig.class, 
    SessionFactoryConfig.class},
    initializers = ConfigFileApplicationContextInitializer.class)
@TestPropertySource(locations={"/application.yml"})
public class BusinessSampleRecieverTests {


    @Test
    public void test() {

    }

}

sample-ingest-business.xml 中的细分,指定 pollerErrorChannel 作为频道

   <int-sftp:inbound-channel-adapter id="sftpInboundAdapterBusiness"
        channel="sftpInboundBusiness"
        session-factory="sftpSessionFactory"
        local-directory="${sftp.localdirectory}/business-local"
        filter="businessCompositeFilter"
        remote-file-separator="/"
        remote-directory="${sftp.directory}/business-sftp">
    <int:poller cron="${sftp.cron}"  max-messages-per-poll="1" error-channel="pollerErrorChannel"/>
</int-sftp:inbound-channel-adapter>

这是Java类,它指定 pollerErrorChannel 作为@ServiceActivator的InputChannel

@Slf4j
@MessageEndpoint
@Component
public class SFTPSampleReceiver {

    @ServiceActivator(inputChannel = "pollerErrorChannel", outputChannel = "errorUploadChannel")

    public Message<String> processInvalidSample(GenericMessage errorMessage) {

        String error = ((Exception) errorMessage.getPayload()).getCause().toString();
        String fileName = ((MessagingException) errorMessage.getPayload()).getFailedMessage().getHeaders()
            .get("file_name").toString();
        String directory = ((MessagingException) errorMessage.getPayload()).getFailedMessage().getHeaders()
            .get("sample_type").toString() + "-sftp";
        String shortFileName = fileName.replace(".xml", "");
        String errorFile = shortFileName + "_error.txt";

        log.debug(fileName + " Was invalid and rejected.");

        final Message<String> message = MessageBuilder.withPayload(error).setHeader("error_file_name",
            errorFile).setHeader("file_name", fileName).setHeader("short_file_name",
            shortFileName).setHeader("directory", directory).build();

        return message;
    }


}

感谢

2 个答案:

答案 0 :(得分:0)

您必须声明pollerErrorChannel bean。

只需@ServiceActivator(inputChannel = "pollerErrorChannel",就可以自动创建该频道。 <poller>稍早被解析并填充为bean。

我们可能会审核PollerParser使用MessagePublishingErrorHandler.setDefaultErrorChannelName()而不是errorHandler.addPropertyReference("defaultErrorChannel", errorChannel);,以便根据需要延迟解析频道。

随意提出问题JIRA

答案 1 :(得分:0)

Garys评论添加&lt; INT:注解配置/&GT;你的XML工作