用于集成测试的模拟JmsTemplate

4
在我的应用程序中,需要模拟JmsTemplate以进行集成测试。
在我的appcontext.xml文件中:
<bean id="core_connectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiTemplate">
            <ref bean="core_jndiTemplate" />
        </property>
        <property name="jndiName">
            <value>ConnectionFactory</value>
        </property>
    </bean>

    <bean id="core_jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
        <property name="connectionFactory" ref="core_connectionFactory" />
        <property name="defaultDestination" ref="core_destination" />
    </bean>


    <bean id="core_destination" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiTemplate">
            <ref bean="core_jndiTemplate" />
        </property>
        <property name="jndiName">
            <value>queue/CoreQueue</value>
        </property>
    </bean>

需要在我的testcontext.xml中模拟jmstemplete。 提前致谢。

core_jmsTemplate 没有被任何地方使用 - 这是正确的吗?我不认为需要模拟。尽管如此,您可以使用 Spring 配置文件来创建一个或另一个 bean,具体取决于活动配置文件。 - Florian
我正在test-context.xml中导入app-context.xml,因此它需要被初始化。 - sp_user123
2个回答

9
或者以Spring 4的风格呈现 ;)
@Bean
public JmsTemplate jmsTemplate() {
    return Mockito.mock(JmsTemplate.class);
}

正如@Stephane所说,但不需要使用xml。
但我仍然建议您在集成测试中使用嵌入式代理程序,因为它可以让您检查队列中到底发生了什么。


2
以下内容怎么样?
<bean id="core_jmsTemplate" class="org.mockito.Mockito" factory-method="mock">
    <constructor-arg value="org.springframework.jms.core.JmsTemplate"/>
</bean>

您可能需要在测试中注入模板并配置模拟数据(given(...).willReturn)。


我有一个问题,Spring会像普通bean一样创建代理模拟。在这种情况下,when(..).thenReturn(..)可以正常工作,但是verify(..)会提示我应该在模拟对象上执行该方法。 - Piotr Gwiazda
除非您的应用程序中有一个超宽的切入点,否则没有理由在那个东西上创建代理。恐怕您需要找出为什么会创建代理。 - Stephane Nicoll

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接