Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在拆卸(@After)方法上断言是否错误?_Java_Unit Testing_Junit - Fatal编程技术网

Java 在拆卸(@After)方法上断言是否错误?

Java 在拆卸(@After)方法上断言是否错误?,java,unit-testing,junit,Java,Unit Testing,Junit,我有多个测试用例,即使逻辑不同,它们的输出都必须相等。因此,我在思考如何对它们进行概括,并只放置一次Assert方法 有没有比这更好的方法: static public class Tests() { private static String expected = null; private String actual = null; @BeforeClass public static void setUpBeforeClass() throws Exce

我有多个测试用例,即使逻辑不同,它们的输出都必须相等。因此,我在思考如何对它们进行概括,并只放置一次Assert方法

有没有比这更好的方法:

static public class Tests() {

    private static String expected = null;
    private String actual = null;

    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
        expected = new String("My Desired Output");
    }

    @Before
    public void setUp() {
        actual = new String();
    }

    @Test
    public void test1() throws Exception {
        actual = ...
    }

    @Test
    public void test2() throws Exception {
        actual = ...
    }

    @After
    public void tearDown() throws Exception {
        assertThat(actual, is(equalTo(expected)));
    }

    @AfterClass
    public static void tearDownAfterClass() {
    }
}
运行方式:

@Test
public void runTests() {
    Result result = JUnitCore.runClasses(Tests.class);
    assertThat(result.getRunCount(), is(2));
    assertThat(result.getFailureCount(), is(0));
}

如果您必须泛化,那么您可以创建一个方法,如

private void testIt ( String actual ) {
    assertThat(actual, is(equalTo(expected)));
}
从你所有的测试方法中调用它


如果一个测试失败了,那么哪个测试失败了就更明显了。

是的,在tearDown方法中断言是个坏主意。根据JUnit文档,此方法存在于

拆下设备,例如,关闭网络连接。此方法在执行测试后调用

我认为在测试类中存储期望值和实际值通常是个坏主意。这些变量依赖于测试,所以将它们存储在测试用例中,并在测试用例中进行断言。例如:

public class FooTest {

    @Test
    public void testFoo() {
        Object expected = // ...
        Object actual = // ...

        assertThat(actual, is(equalsTo(expected)));
    }

}

另外,我在代码中看到,所有测试都具有相同的预期值。改变您的测试可能是一个好主意,这样返回的值总是不同的。始终只测试一个预期值,以确保代码能够实现此预期结果。尝试更多,可能非常不同,并尝试测试一些特殊情况。

我正在测试的类是一种构建器类,因此我可以使用不同的方法构建输出。通过这些测试,我可以确保所有方法都正常工作,并且正确生成输出。我已经在我的一个方法中检测到一个错误。此外,在我们的测试中使用静态是一个坏主意。@emory,你的意思是针对一个静态变量断言,或者使用静态方法,或者两者都使用?@Alexander:在这种情况下,尝试使用其他值的其他方法,这将生成不同的输出。对于给定的输出,您的方法可以很好地工作,而对于另一个输出,您的方法可能会被破坏,因此测试不同的值始终是一个好主意,它可以扩展您的测试用例。@Alexander如果您按照Vivien的建议做,那么这根本不会成为问题。如果你有一个静态的期望变量,那么测试并不是相互独立的。