编写更好的JUnit参数化测试用例

时间:2012-09-14 09:21:19

标签: java junit junit4 hamcrest

我有一个有趣的要求。我希望在我的应用程序中尽可能提供更好的测试用例。我正在使用Parameterized Junit来运行具有多个不同输入的测试用例。我的示例测试类看起来像这样:

@Parameters
public static Collection<Object[]> testInputs()
{
    return Arrays.asList({
        {1, CoreMatchers.is(1)},
        {2, CoreMatchers.is(2)}
    });
}
@Test
public test()
{
    myApp.run(); 
    assertThat(myApp.getA(), matcher);
}

这样,我用我的测试参数定义了断言逻辑。现在我想在测试用例上运行多个匹配器,其中一些可以是我写的自定义匹配器。

@Parameters
public static Collection<Object[]> testInputs()
{
    return Arrays.asList({
        {1, Arrays.asList( CoreMatchers.is(1), CustomMatchers.status(1) ) },
        {2, Arrays.asList( CoreMatchers.is(2), CustomMatchers.status(2) ) }
    });
}

断言就像:

for(Matcher<MyApp> matcher: matchers)
{
    assertThat(myApp, matcher);
}

但问题是,两个匹配器都运行在不同的对象上。我可以定义CustomMatcher的最佳方法是什么?

我应该按照匹配器的类型对断言进行分类吗?

我将不胜感激任何帮助。提前谢谢。

1 个答案:

答案 0 :(得分:1)

我不确定你在问什么,但我认为你最好使用纯java.lang个对象而不是JUnit对象作为参数。所以

return Arrays.asList({
    {1, 1},
    {2, 2}
});

并在实际测试中使用is匹配器。

如果匹配器做了非常不同的事情,请不要使用参数化测试,只需使用单独的测试方法。为减少重复,请使用常用的重构工具来提取测试方法之间的常用方法。