我正在尝试测试以下课程:

package com.myclass;
public class MyClass {
    private Map<String, String> dataMap = new HashMap<>();

    public void extractInfoFromLine(String line) throws InvalidInputException {
        String[] words = line.split(" ");
        if (dataMap.containsKey(words[0])) {
            throw new InvalidInputException();
        }
        dataMap.put(words[0], words[2]);
    }
    public void confirmInfoPresent(String name) {
        // Do something
    }
}


使用此TestNG类:

package com.myclass;
public class MyClassTest {
    private MyClass myClass;

    @DataProvider(name = "invalid-data-provider")
    public Object[][] invalidDataProvider() {
        return new Object[][] {
                { "A is B", "A"},
                { "A is D", "A"},
        };
    }

    @BeforeTest()
    public void setup() {
        myClass = new MyClass();
    }
    @Test(dataProvider = "invalid-data-provider", expectedExceptions = InvalidInputException.class)
    public void testExceptionalExtractValueForKey(String line, String name) throws InvalidInputException {
        myClass.extractInfoFromLine(line);
        myClass.confirmInfoPresent(name);
    }
}


我为此定义了以下自定义异常:

package com.myclass;
public class InvalidInputException extends Exception {
    public InvalidInputException() {
        super();
    }

    public InvalidInputException(String message) {
        super(message);
    }

    public InvalidInputException(String message, Throwable cause) {
        super(message, cause);
    }

    public InvalidInputException(Throwable cause) {
        super(cause);
    }
}


但是,当我运行此测试用例时,出现以下错误:

Expected exception com.myclass.InvalidInputException but got org.testng.TestException:
Method MyClassTest.testExceptionalExtractValueForKey(java.lang.String, java.lang.String)[pri:0, instance:com.myclass.MyClassTest@3930015a] should have thrown an exception of class com.myclass.InvalidInputException


我尝试用标准异常替换我的自定义异常,但仍然得到相同的结果。

有人可以帮我吗?

最佳答案

@KarthickS,三个不同的人已经给您相同的答案。我不明白还应该解释什么以及如何解释。
在第一个@Test迭代中,dataMap为空(dataMap.containsKey(words[0]) == false),因此,“ if”语句体内的代码将不会执行;这意味着您的异常不会被抛出。
由于@Test批注中设置了“ expectedExceptions”属性,因此TestNg将威胁测试失败。由于dataMap不再为空(dataMap.put(words[0], words[2])-您已在第一次运行时添加了数据,因此第二次测试迭代将通过。
TestNg doc再一次谈到“ expectedExceptions”:测试方法应抛出的异常列表。如果没有异常或与该列表中的异常不同,则此测试将标记为失败。

10-08 00:09