Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在单元测试中用于在新JndiContext中构造bean时,ProducerTemplate为null_Java_Unit Testing_Apache Camel - Fatal编程技术网

Java 在单元测试中用于在新JndiContext中构造bean时,ProducerTemplate为null

Java 在单元测试中用于在新JndiContext中构造bean时,ProducerTemplate为null,java,unit-testing,apache-camel,Java,Unit Testing,Apache Camel,在单元测试中用于在新JndiContext中构造bean时,ProducerTemplate为null 我正在尝试对一个路由进行单元测试,该路由使用bean动态构建sftp端点。当我在正常的上下文中运行我的路由时,这会起作用,因为似乎注册表中已经有一个模板,并且可以正确地注入 我的问题是,在尝试构造单元测试时,我似乎遇到了这样一种情况:当调用createJndiContext时,ProducerTemplate仍然为null,这导致我的bean中的NPE需要调用模板上的方法 任何帮助都将不胜感激

在单元测试中用于在新JndiContext中构造bean时,ProducerTemplate为null

我正在尝试对一个路由进行单元测试,该路由使用bean动态构建sftp端点。当我在正常的上下文中运行我的路由时,这会起作用,因为似乎注册表中已经有一个模板,并且可以正确地注入

我的问题是,在尝试构造单元测试时,我似乎遇到了这样一种情况:当调用
createJndiContext
时,ProducerTemplate仍然为null,这导致我的bean中的NPE需要调用模板上的方法

任何帮助都将不胜感激

下面是一个简化的单元测试,说明了这一点:

public class BeanWithProdTemplateDependencyTest
  extends CamelTestSupport
{

  private static final Logger log = LoggerFactory.getLogger(BeanWithProdTemplateDependencyTest.class);
  private static final String FROM = "direct:start";

  @EndpointInject(uri = "mock:result")
  protected MockEndpoint resultEndpoint;

  @Before
  public void setUp() throws Exception {

    super.setUp();
    context.getRouteDefinition("my-cool-route").adviceWith(context, new AdviceWithRouteBuilder()
    {

      @Override
      public void configure()
        throws Exception
      {
        replaceFromWith(FROM);

      }
    });
    startCamelContext();

  }

  @Test
  public void test()
  {
    template.sendBody(FROM, "cheese");
  }

  @Override
  public boolean isUseAdviceWith()
  {
    return true;
  }

  @Override
  protected Context createJndiContext()
    throws Exception
  {
    JndiContext context = new JndiContext();
    MyBean myBean = new MyBean(template);
    context.bind("myBean", myBean);

    return context;
  }

  @Override
  protected RouteBuilder createRouteBuilder()
    throws Exception
  {
    return new RouteBuilder()
    {

      @Override
      public void configure()
        throws Exception
      {
        from("jms:queue:inbox")
        .routeId("my-cool-route")
        .beanRef("myBean", "doStuff")
        .log("Body: $body}")
        .to("mock:result");
      }
    };
  }

  public class MyBean {

    private final ProducerTemplate producerTemplate;
    public MyBean(ProducerTemplate template)
    {
      this.producerTemplate = template;
    }

    public void doStuff() throws Exception{
      // NPE here, template is null
      this.producerTemplate.sendBody("seda:foo", "beer");
    }
  }
}

我用一点小技巧解决了这个问题

我想做的太多太快了。我消除了对
createJndiContext()
的覆盖,并在测试中将这些行添加到
setUp()
方法中:

MyBean myBean = new MyBean(template);

JndiRegistry registry = (JndiRegistry) (
    (PropertyPlaceholderDelegateRegistry)context.getRegistry()).getRegistry();
registry.bind("myBean", myBean);
这允许我使用非空的ProducerTemplate创建bean,并将其推入由
CamelTestSupport.setUp()

创建的注册表。通过查看代码,我可以看到这是如何发生的,因为创建Camel上下文的操作也会生成bean JndiRegistry以及创建模板之前发生的所有事情。那我怎么短路呢?