我正在尝试使用org.testng.Assert声明2个用例的简单代码。在第一个用例中,我声明了2个不相等的值,它们正确Fail

但是在第二个用例中,当我在try-catch块中声明2个不相等的值时,结果总是以Pass的形式返回

我的代码如下:

package demo;
import org.testng.Assert;
import org.testng.annotations.Test;
public class Q43710035
{

    @Test
    public void test1()
    {
        System.out.println("Within test1");
        int a = 12;
        int b =20;
        Assert.assertEquals(a, b);

    }

    @Test
    public void test2()
    {
        System.out.println("Within test2");
        int a = 12;
        int b =20;

        try
        {
            Assert.assertEquals(a, b);
        }catch(Throwable t)
        {
            System.out.println("Exception Occurred");
        }
    }
}

我得到的结果是:
Within test1
Within test2
Exception Occurred
PASSED: test2
FAILED: test1
java.lang.AssertionError: expected [20] but found [12]
at org.testng.Assert.fail(Assert.java:94)

我的问题是:
  • 在test2()中,虽然断言失败了,为什么执行不是从此Test出来的?
  • 在test2()中,try块似乎失败,因此执行到达catch块,并且Exception Occurred被打印。当执行断言代码时,为什么try块在这里失败?
  • 最佳答案

    如果你通过junit4的源代码,https://github.com/junit-team/junit4/blob/master/src/main/java/junit/framework/Assert.java#L71

    你会明白为什么 test1 失败了

    第1部分:


    static public void assertEquals(String message, Object expected, Object actual) {
        if (expected == null && actual == null) {
            return;
        }
        if (expected != null && expected.equals(actual)) {
            return;
        }
        failNotEquals(message, expected, actual); //It calls Part#2
    }
    

    第2部分:
    static public void failNotEquals(String message, Object expected, Object actual) {
        fail(format(message, expected, actual)); //It calls Part#3 format(...) method
    }
    

    第 3 部分:
    public static String format(String message, Object expected, Object actual) {
        String formatted = "";
        if (message != null && message.length() > 0) {
            formatted = message + " ";
        }
        return formatted + "expected:<" + expected + "> but was:<" + actual + ">";
    }
    

    所以你得到了 Part#3 的返回消息



    要全面了解异常 JUnit 规则,请查看 following tutorial :

    期望异常 JUnit 规则

    要断言 JUnit 抛出了异常,通常使用 try/fail/catch 习惯用法或 @Test 注释的预期元素。尽管比前者更简洁,但有人认为使用 expected 并不支持您可能想要测试的所有情况。该示例是在异常之后执行附加测试或针对实际异常消息进行测试。

    JUnit 4.7 引入了下一个进程,一个提供两全其美的@Rule。本文权衡了每种方法的优缺点,并仔细研究了每种方法的语法。
    try/fail/catch 成语

    典型的模式是捕获异常或在从未抛出异常时显式失败。
    @Test
    public void example1() {
        try {
            find("something");
            fail();
        } catch (NotFoundException e) {
            assertThat(e.getMessage(), containsString("could not find something"));
        }
        // ... could have more assertions here
    }
    

    这将通过以下方式突出显示失败。
    java.lang.AssertionError: expected an exception
        at org.junit.Assert.fail(Assert.java:91)
        at bad.roboot.example.ExceptionTest.example1(ExceptionTest.java:20)
        ...
    

    该习语具有潜在的优势,因为它提供了针对实际异常进行断言以及在预期之后执行额外工作的机会。除了噪音之外,主要的缺点是很容易忘记包含失败调用。如果真的先做测试,我们总是以红色进行测试,这不会成为问题,但事情往往会从网上溜走。在实践中,我见过太多的示例,其中缺少失败会导致误报。

    @Test(预期 = Exception.class)

    使用预期的元素,我们可以按如下方式重写测试。
    @Test (expected = NotFoundException.class)
    public void example2() throws NotFoundException {
        find("something");
        // ... this line will never be reached when the test is passing
    }
    

    这将导致以下失败。
    java.lang.AssertionError: Expected exception: bad.robot.example.NotFoundException
    

    资源链接: What exactly does assertEquals check for when asserting lists?

    关于Java-TestNG : Why does my Assertion always passes when written within try-catch block,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43718882/

    10-13 03:47