代码之家  ›  专栏  ›  技术社区  ›  Kris Swat

如何在Spring集成中模拟连接工厂

  •  0
  • Kris Swat  · 技术社区  · 6 年前

    我想模拟JMS连接工厂进行集成测试。

    <jee:jndi-lookup id="narconFactory" jndi-name="LBARQCF" resource-ref="false"/>
    

    何时(?)

    我们使用WebSphereServer,对于集成测试,需要使用Tomcat。弹簧靴版本为1.5.3

    编辑 : 基于评论,我创建了一个类

    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class MQControllerTest {
    
    //step 2
    @Autowired
    private MockMvc mvc;
    
    @MockBean
    private MQController mqController;
    
    protected static final ConnectionFactory amqFactory = new ActiveMQConnectionFactory("vm://localhost?broker.persistent=false");
    
    public static final CachingConnectionFactory connectionFactory = new CachingConnectionFactory(amqFactory);
    
    @BeforeClass
    public static void startUp() throws Exception {
        connectionFactory.setCacheConsumers(false);
        connectionFactory.createConnection().close();
    }
    
    @AfterClass
    public static void shutDown() {
        connectionFactory.resetConnection();
    }
    
    @Autowired
    private JmsTemplate mockJmsTemplate;
    
    @Autowired
    private SourcePollingChannelAdapter startJms;
    
    
    @Before
    public void setup() throws JMSException{
        Mockito.reset(this.mockJmsTemplate);
    }   
    
    @Test
    public void test_tbm_vrijeDagenCorrectie() throws Exception {
    
        String expectedResponse ="";
        //using bddmockito
        given(mqController.tmVDCorrect(any(String.class))).willReturn(expectedResponse);
    
        this.startJms.start();
    
        mvc.perform(get("/tm/vdc/{dgn}","2016-01-16"))
                   .andExpect(status().isOk());
    
    }
    

    }

    在我的资源配置文件**编辑**中,使用了完整的包名并将ConnectionFactory设置为公共的

        <util:constant id="narconFactory" static-field="n.d.poc.MQControllerTest.connectionFactory"/>
         <util:constant id="vanconFactory" static-field="n.d.poc.MQControllerTest.connectionFactory"/> 
    

    错误:

    “org.springframework.test.web.servlet.mockmvc”类型的限定bean不可用:应至少有1个bean,该bean符合autowire候选条件。依赖项注释:@org.springframework.beans.factory.annotation.autowired(必需=true) 在Org.Spring Frase.Beas.Fual.DeFultListabeBeApWork.ReISeNoMaTaCing BeNeDebug(Debug TabeBabeBeNealth.java:1474)~[Spring Beangs4.3.5.Relp:JAR:4.3.5.发布]

    不知道我犯了什么错误 编辑2:

    原因:org.springframework.beans.factory.bean CreationException: 创建名为“narconfictory”的bean时出错:调用 Init方法失败;嵌套异常为 javax.naming.noInitialContextException:需要在中指定类名 环境或系统属性,或作为小程序参数,或在 应用程序资源文件:java.naming.factory.initial at Org.Spring Frask. Bea.工厂. Suff.ActuaToWiReCopababeBeAptudio.IrrimaleBebean(ActuaToWiReCopababeBeNealPo.java:1628) ~[弹簧豆-4.3.8.释放.罐:4.3.8.释放]在 org(第555版) ~[弹簧豆-4.3.8.释放.罐:4.3.8.释放]在 Org.Spring Frask.Bea.工厂. Suff.ActuaToWiReCopababeBe工厂. createBean(ActuaToWiReCopababeBeNealPo.java:483) ~[弹簧豆-4.3.8.释放.罐:4.3.8.释放]在 Org.Spring Frask.Bea.工厂. Suf.BeaNe工厂$ 1 .GETObjor(抽象BeaPo工厂.java:306) ~[弹簧豆-4.3.8.释放.罐:4.3.8.释放]在 Org.Spring Frask.Bea.工厂.支持. Debug Stutelon BeNeRealth.GigStuton(Debug Stutelon BeNeReqs.java:230) ~[弹簧豆-4.3.8.释放.罐:4.3.8.释放]在 org(第302版) ~[弹簧豆-4.3.8.释放.罐:4.3.8.释放]在 Org.Spring Frask.Bea.工厂. Suff.BeaPo工厂.GETBeA(Excel BeaStudio . Java:197) ~[弹簧豆-4.3.8.释放.罐:4.3.8.释放]在 org(第742版) ~[弹簧豆-4.3.8.释放.罐:4.3.8.释放]在 org .prgFrrask.Value.Suff.ActudiAppultError.FixBeBeaseFiffic初始化(ExabpAptudio上下文. Java:866) ~[spring-context-4.3.8.发布.jar:4.3.8.发布] org .prgFrrask.Value.Suff.ActudiAptualPort.Rebug(AptudioCort.java:542) ~[spring-context-4.3.8.发布.jar:4.3.8.发布] Org.Spring Frask.Boo.Spring Apple。刷新(Spring Apvest.java:737) ~[Spring-boot-1.5.3.释放.jar:1.5.3.释放] Org.Spring Frask.Boo.Spring Apvest.刷新上下文(Spring Aptudio.java:370) ~[Spring-boot-1.5.3.释放.jar:1.5.3.释放] Org.Spring Frask.Boo.Spring Apvest.Run(Spring Apvest.java:314) ~[Spring-boot-1.5.3.释放.jar:1.5.3.释放] org .prgFrrask.Boo..Test.ForCE. Spring BooTo CortExoalLoad .Load上下文(Spring BooTo Excel加载程序. Java:120) ~[Spring-boot-test-1.5.3.释放.jar:1.5.3.释放] org(98) ~[弹簧测试-4.3.8.释放.震击器:4.3.8.释放]在 org .prgFrrask.Test.Curror.Cache .Debug TraceCeaWeAdExtSeriService委托.加载上下文(Debug TraceAcEaService LoopeService委托. Java:116) ~[弹簧测试-4.3.8.释放.震击器:4.3.8.释放]…27普通帧 省略

    为什么单元测试要查找java.naming.factory.initial?我可以提供应用程序属性和什么值?

    EdTe3:

    GitHub中的示例代码 https://github.com/kswat/LRIntegrationUnit

    1 回复  |  直到 6 年前
        1
  •  1
  •   Artem Bilan    6 年前

    我建议考虑将ActiveMQ与其嵌入模式一起使用,而不是模拟。这样,您将得到完全成熟的JMS,并且不会处理低级资源来进行模拟。

    在Spring集成中,我们将其用于测试目的:

    /**
     * Keeps an ActiveMQ {@link VMTransport} open for the duration of
     * all tests (avoids cycling the transport each time the last
     * connection is closed).
     * @author Gary Russell
     * @since 3.0
     *
     */
    public abstract class ActiveMQMultiContextTests {
    
        protected static final ConnectionFactory amqFactory = new ActiveMQConnectionFactory("vm://localhost?broker.persistent=false");
    
        protected static final CachingConnectionFactory connectionFactory = new CachingConnectionFactory(
                amqFactory);
    
        @BeforeClass
        public static void startUp() throws Exception {
            connectionFactory.setCacheConsumers(false);
            connectionFactory.createConnection().close();
        }
    
        @AfterClass
        public static void shutDown() {
            connectionFactory.resetConnection();
        }
    
    }
    

    connectionFactory 静态属性确实可以用作bean:

    <util:constant id="narconFactory"
                   static-field="ActiveMQMultiContextTests.connectionFactory"/>