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

Java 编写更好的JUnit参数化测试用例,java,junit,junit4,hamcrest,Java,Junit,Junit4,Hamcrest,我有一个有趣的要求。我希望在我的应用程序中有尽可能好的测试用例覆盖率。我使用参数化Junit来运行具有不同输入数量的测试用例。我的示例测试类如下所示: @Parameters public static Collection<Object[]> testInputs() { return Arrays.asList({ {1, CoreMatchers.is(1)}, {2, CoreMatchers.is(2)} }); } @Tes

我有一个有趣的要求。我希望在我的应用程序中有尽可能好的测试用例覆盖率。我使用参数化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);
}
@参数
公共静态集合testInputs()
{
返回数组.asList({
{1,CoreMatchers.is(1)},
{2,CoreMatchers.is(2)}
});
}
@试验
公开考试()
{
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) ) }
    });
}
@参数
公共静态集合testInputs()
{
返回数组.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);
}
for(匹配器匹配器:匹配器)
{
资产(myApp,matcher);
}
但问题是,两个匹配器运行在不同的对象上。我定义CustomMatcher的最佳方式是什么

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


我将感谢任何帮助。提前谢谢。

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

return Arrays.asList({
    {1, 1},
    {2, 2}
});
并在实际测试中使用
is
匹配器


如果Matcher正在做真正不同的事情,不要使用参数化测试,只使用单独的测试方法。为了减少重复,请使用常用的重构工具提取测试方法之间的常用方法。

我不确定“两个匹配器都在不同的对象上运行”是什么意思,但您可以使用将匹配器组合到一个测试运行中。这样,您就不需要遍历匹配器列表,并且可以传递任意数量的匹配器,包括一个匹配器

@Parameters
public static Collection<Object[]> testInputs()
{
    return Arrays.asList({
        {1, CoreMatchers.allOf( CoreMatchers.is(1), CustomMatchers.status(1) ) },
        {2, CoreMatchers.allOf( CoreMatchers.is(2), CustomMatchers.status(2) ) }
    });
}
@参数
公共静态集合testInputs()
{
返回数组.asList({
{1,CoreMatchers.allOf(CoreMatchers.is(1),CustomMatchers.status(1)),
{2,CoreMatchers.allOf(CoreMatchers.is(2),CustomMatchers.status(2))}
});
}