使用uri中的方法选项模拟bean端点

时间:2017-11-06 13:32:59

标签: spring testing mocking apache-camel

我使用Apache Camel 2.15.3构建应用程序。我使用spring-xml连接路由以进行依赖注入。我试图编写一个测试,我在这里模拟一个bean的端点并在uri中有一个方法选项。

我的路线如下:

<onException id="Exception">
    <exception>java.lang.Exception</exception>
    <handled>
        <constant>true</constant>
    </handled>
    <to uri="direct:fear"/>
</onException>

<route id="happyStory">
    <from uri="direct:inTheBeginning"/>
    <to uri="bean:enchantedKingdom?method=warn" />
    <to uri="bean:fluffykins" />
</route>

<route id="scaryStory">
    <from uri="direct:fear"/>
    <onException>
        <exception>java.lang.Exception</exception>
        <handled>
            <constant>true</constant>
        </handled>
    </onException>
    <to uri="bean:monster"/>
    <choice>
        <when>
            <simple>${header.succesfullywarned}</simple>
            <to uri="bean:enchantedKingdom?method=hide"/>
        </when>
        <otherwise>
            <to uri="bean:enchantedKingdom?method=panic" />
        </otherwise>
    </choice>
</route>

而且我不能说当调用bean方法警告时,标题&#34;成功警告&#34;应该在消息中设置,然后当调用bean fluffykins时,应该有一个异常导致消息被发送到&#34; scaryStory&#34;在这种情况下,我不能断言豆子方法恐慌&#39;被称为。

这是测试:

@RunWith(CamelSpringJUnit4ClassRunner.class)
@ContextConfiguration({"/META-INF/spring/route-stories.xml","/META-INF/spring/beans.xml"})
@MockEndpointsAndSkip("(bean:fluffykins|bean:monster|bean:enchantedKingdom?method=warn|bean:enchantedKingdom?method=hide|bean:enchantedKingdom?method=panic)")
public class StoryHappyRouteTest extends CamelSpringTestSupport {

    private String url = "direct:inTheBeginning";

    @Autowired
    private ApplicationContext applicationContext;

    @Override
    protected AbstractApplicationContext createApplicationContext() {
       return (AbstractApplicationContext)applicationContext;
    }

    @Test
    public void test(){

        MockEndpoint warn = getMockEndpoint("mock:bean:enchantedKingdom?method=warn");
        MockEndpoint fluffy = getMockEndpoint("mock:bean:fluffykins");
        MockEndpoint  monster = getMockEndpoint("mock:bean:monster");
        MockEndpoint hide = getMockEndpoint("mock:bean:enchantedKingdom?method=hide");
        MockEndpoint panic = 
        getMockEndpoint("mock:bean:enchantedKingdom?method=panic");

        fluffy.whenAnyExchangeReceived(new Processor() {
        @Override
        public void process(Exchange exchange) throws Exception {
            System.out.println("Bunny!");
            throw new NullPointerException();
        }
        });

        template.sendBody(url,"");

        warn.assertExchangeReceived(0);
        fluffy.assertExchangeReceived(0);
        monster.assertExchangeReceived(0);
        panic.assertExchangeReceived(0);

   }
}

除了enchantedKingdom bean之外,它适用于所有bean,它包含路由中使用的多个方法。在这种情况下不使用mock,但调用了真正的bean方法,这不是我想要的。测试失败,因为它不是在路径中被调用的模拟。

如何通过uri&bean使用模拟器作为endpoits:enchantedKingdom?method = warn&#39;,&#39; bean:enchantedKingdom?method = hide&#39;和bean:enchantedKingdom?method = panic&#39;?

1 个答案:

答案 0 :(得分:0)

我会更改测试方法而不是尝试模拟对bean的调用。 相反,创建一个模拟的bean实例并在测试中使用它。

定义一个模拟bean(通过代码或模拟库)

public class MockEnchantedKingdom {

    public boolean panicCalled = false;

    public void panic() {
        // do things
        panicCalled = true;
    }
}

然后在用于测试目的的spring文件中声明此bean

@ContextConfiguration(
    {"/META-INF/spring/route-stories.xml",
    "/META-INF/spring/beans-test1.xml"})

在你的测试代码中获取bean并断言你需要的东西

// context is CamelContext you should have access to it
MockEnchantedKingdom enchantedKingdom = (MockEnchantedKingdom) context.getRegistry().lookupByName("enchantedKingdom");
Assert.asserttrue(enchantedKingdom.panicCalled);

为不同的测试创建不同的beans-test*.xml,您可以使用Mockito或任何其他库创建模拟。

路由代码始终相同,您可以控制每个测试中bean的行为。