如何编写骡子定制变压器的单元测试用例

时间:2012-10-17 08:41:30

标签: java junit junit4 esb mule

我们试图在Mule中为自定义变换器编写Junit测试用例。 但是我们无法在测试类中调用doTransform()方法。

后来我们意识到看到Mule为单元测试用例提供功能的mule文档。 根据我们扩展的文档AbstractTransformerTestCase,有一些方法可以实现。

他们是:

@Override
    public Transformer getTransformer() throws Exception {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public Transformer getRoundTripTransformer() throws Exception {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public Object getTestData() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public Object getResultData() {
        // TODO Auto-generated method stub
        return null;
    }

我们现在对以下事情感到困惑:

  1. 在哪里写我们的测试逻辑?
  2. 其中&如何将输入发送到Transformer?
  3. 我们从变压器返回什么?
  4. 如果我们没有从变压器返回任何东西(变压器是流程中的最后一个终点)怎么办?
  5. 如何“调用”测试用例?
  6. 如何编写需要自定义异常的测试用例?
  7. 在Eclipse中的Junit测试中,我们曾经将它声明为@Test(expected = RuntimeException.class)但是如何在mule单元测试用例中进行测试?
  8. 我们如何在AbstractTransformerTestCase ??
  9. 中使用现有的'被覆盖的方法'

    请帮助我们。自2周以来我们不了解任何事情。

2 个答案:

答案 0 :(得分:4)

要在Mule中测试变形金刚,请执行以下操作:

  • 扩展org.mule.transformer.AbstractTransformerTestCase并实施抽象方法(look at the test for the Base64 transformer as a good example)。这涵盖了变压器的基础知识。
  • 如果您想要覆盖更多高级方案,例如使用不同的有效负载或属性,则通过扩展org.mule.tck.junit4.FunctionalTestCase创建功能测试用例并创建标准JUnit4 @Test方法进行交互使用您将在测试配置中配置的变压器。

答案 1 :(得分:0)

当您开始测试时,您可以从使用测试驱动开发等良好实践开始。你需要:

  • junit in the version version(you already it it)
  • 现代模拟框架(我强烈建议将jmockit作为目前最灵活的工具)

您不需要:

  • 来自mule的抽象基础测试类

当您编写变换器测试时,您正在测试变换器的行为是否正常(好吧,它将一个对象转换为另一个对象) - 因此在您的测试用例中,您只需实例化变换器并使用一些输入命中转换方法并执行断言结果。如果您的变压器可以在没有mule的情况下实例化,并且在转换时不需要协作,那么您只需要进行单元测试。

如果您需要与mule,Java EE或您需要测试它们的任何子系统进行协作 - 这里模拟就会发挥作用。您只需提供模拟并定义您的类与其协作的期望(您正在测试您的类,mulen或JDBC驱动程序),而不是在服务基础结构时进行操作。以下是另一个奇怪环境(android)的单元测试示例:

/**
 * shall inject assignable views   into class
 * note that mocks are specifuied as parameters
 */
@Test
public void testSimpleInjection(@Mocked final WithInjectableViews injectable,
                                @Mocked final TextView textView,
                                @Mocked final Button button) {

    // we expect that  certain methods will be called on mocked objects
    new Expectations() {
        {
            injectable.findViewById(239);
            returns(textView);


            injectable.findViewById(555);
            returns(button);


        }
    };

    // method under test
    ViewInjector.startActivity(injectable);

    // assertions
    assertEquals(textView, Deencapsulation.getField(injectable, "asView"));
    assertEquals(button, Deencapsulation.getField(injectable, "button"));
    assertNull(Deencapsulation.getField(injectable, "notInjected"));

}

// class derived from android activity,  base class is not instantiable
// in normal java environment, only on the phone or emulator but this is not
// practicable
class WithInjectableViews extends Activity {
    // shall be injected
    @InjectView(id = 239)
    private android.view.View asView;
    @InjectView(id = 555)
    private Button button;
    // shall be left alone
    private View notInjected = null;

}