コンフィギュレーションにImportResourceで上書きプライマリ春の豆

thomas77:

私は、XML-configにBean内の既存を上書きすることになっている春のテスト・コンフィギュレーション・クラスを持っています。しかし、私の問題は、XML Beanが私のテスト-config設定で主に注釈付きBeanをオーバーライドすることにあります。私は別の名前でテストBeanを命名しようとしたが、それはどちらか私のために働いていません。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {CamelJmsTest.TestConfig.class})
public class CamelJmsTest {

    @Configuration
    @ImportResource("classpath:production-beans-camel-jms.xml")
    public static class TestConfig {

    @Primary
    @Bean
    public JmsTemplate jmsTemplate() {
        return new JmsTemplate(new ActiveMQConnectionFactory("", "", ACTIVE_MQ_HOST));
    }

    @Primary
    @Bean // ideally i just want this bean to override the bean imported from the xml config
    public RouteConfigBuilder routeConfig() {
        return RouteConfigBuilder.builder().autoStart(true).build();
    }

    @Primary
    @Bean
    public RouteBuilder routeBuilder(@Value("${amq.endpoint}") String endpoint,
                                                              @Autowired Processor processor) {
        return new RouteBuilder(routeConfig(), "", endpoint, processor);
    }
}

    private static final String ACTIVE_MQ_HOST = "vm://activeMQ";

  @BeforeClass
  public static void setActiveMQ() {
    System.setProperty("amq.endpoint", ACTIVE_MQ_HOST);
  } 

  @Autowired
  JmsTemplate jmsTemplate;
  @Test
  public void postJmsMessage() {

    jmsTemplate.send("queue/test", new MessageCreator() {
        @Override
        public Message createMessage(Session session) throws 
     JMSException {
            return session.createTextMessage("Hello World");
        }
    });

    try {
        for (int i = 0; i < 100; i++) {
            Thread.sleep(100);
        }
    } catch (Exception ignored) {
    }
  }
}

ここでは、関連するXML設定は次のとおりです。

<bean id="routeConfig" class="routing.RouteConfigBuilder" init-method="builder">
    <constructor-arg name="redeliveryDelay" value="${<props>.redeliveryDelay}" />
    <constructor-arg name="maximumRedeliveries" value="${<props>.maximumRedeliveries}" />
    <constructor-arg name="autoStart" value="false" />
</bean>

<bean id="routeBuilder" class="routing.RouteBuilder">
    <constructor-arg ref="routeConfig" />
    <constructor-arg name="routeId" value="ROUTE_ID_1"/>
    <constructor-arg name="endpoint" value="${amq.endpoint}" />
    <constructor-arg name="processor" ref="myProcessor" />
</bean>    

これは、ログ出力されます。テストを実行する場合:

Overriding bean definition for bean 'routeConfig' with a different 
definition:
  replacing [Root bean: class [null]; scope=; abstract=false; 
  lazyInit=false; autowireMode=3; dependencyCheck=0; 
  autowireCandidate=true; primary=true;
  factoryBeanName=CamelJmsTest.TestConfig; 
  factoryMethodName=routeConfig; initMethodName=null; 
  destroyMethodName=(inferred);
defined in CamelJmsTest]
with [Generic bean: class [RouteConfigBuilder]; scope=; 
 abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0;
  autowireCandidate=true; primary=false; factoryBeanName=null; 
  factoryMethodName=null; initMethodName=builder; 
  destroyMethodName=null;
defined in class path resource [production-beans-camel-jms.xml.xml]]

あなたが見ることができるようにテスト構成の私の主なBeanが上書きされて、私はテストで私のテスト-config設定Beanを使用します。

私は春の4.3.x.を使用しています

私は、関連記事をたくさん読んだが、のどれも私に答えを与えませんでした。任意の助けいただければ幸いです。

ジェフ:

名前の変更は、私の簡易版を働くように見えました。

私はそれが重要とは思わないけどRouteConfigBuilderとRouteBuilderの建設のスタイルは、JavaとXMLの間で異なって表示されます。

4.3.20でテスト済み

package com.stackoverflow.q53757986;

import static org.junit.Assert.*;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.junit.BeforeClass;
import org.junit.ClassRule;
import org.junit.Rule;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;
import org.springframework.context.annotation.Primary;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.test.context.junit4.rules.SpringClassRule;
import org.springframework.test.context.junit4.rules.SpringMethodRule;

@SuppressWarnings("javadoc")
public class CamelJmsTest {

    static final String ACTIVE_MQ_HOST = "vm://activeMQ?broker.persistent=false";

    /** The Constant SPRING_CLASS_RULE. */
    @ClassRule
    public static final SpringClassRule SPRING_CLASS_RULE = new SpringClassRule();

    /** The spring method rule. */
    @Rule
    public final SpringMethodRule springMethodRule = new SpringMethodRule();

    @BeforeClass
    public static void setActiveMQ() {
        System.setProperty("amq.endpoint", ACTIVE_MQ_HOST);
    }

    @Autowired
    JmsTemplate jmsTemplate;

    @Autowired
    RouteConfigBuilder routeConfig;

    @Autowired
    RouteBuilder routeBuilder;

    @Test
    public void postJmsMessage() {

        assertEquals("java", this.routeConfig.source);
        assertEquals("java", this.routeBuilder.source);

        this.jmsTemplate.send("queue/test", (MessageCreator) session -> session.createTextMessage("Hello World"));

        try {
            for (int i = 0; i < 100; i++) {
                Thread.sleep(100);
            }
        } catch (Exception ignored) {}
    }

    @Configuration
    @ImportResource("classpath:production-beans-camel-jms.xml")
    static class TestConfig {

        @Primary
        @Bean
        public JmsTemplate jmsTemplate() {
            return new JmsTemplate(new ActiveMQConnectionFactory("", "", ACTIVE_MQ_HOST));
        }

        @Primary
        @Bean // ideally i just want this bean to override the bean imported from the xml config
        public RouteConfigBuilder routeConfig2() {
            return new RouteConfigBuilder("java");
        }

        @Primary
        @Bean
        public RouteBuilder routeBuilder2() {
            return new RouteBuilder(routeConfig2(), "java");
        }
    }
    }
<?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns = "http://www.springframework.org/schema/beans"
       xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation = "http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">

      <bean id="routeConfig"  class="com.stackoverflow.q53757986.RouteConfigBuilder">
        <constructor-arg name="source" value="xml" />
      </bean>

      <bean id="routeBuilder"  class="com.stackoverflow.q53757986.RouteBuilder">
        <constructor-arg name="routeConfig" ref="routeConfig" />
        <constructor-arg name="source" value="xml" />
      </bean>
    </beans>   

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=171732&siteId=1