TestNG如何在单元测试中测试异常



我需要测试Exception,但它得到了以下错误。

org.testng.TestException: 
Method ContactIdentifierHelperTest.test()
[pri:0, instance:se.cambio.contactadministration.contact.helper.ContactIdentifierHelperTest@6d7b4f4c]
should have thrown an exception of type class SpiderException

测试方法:

@Test(expectedExceptions = { SpiderException.class })
public void test()  {
ContactData contactData = getContactData();
contactIdentifierHelper.getSpellId(contactData);
}

测试方法:

public String getSpellId(final ContactData contactData)
{
String s = null;
try
{
s = someMethod();
}
catch (SpiderException e)
{
e.printStackTrace();
}
return s;
}

我在这方面哪里出了问题?

预期的行为是,您的方法抛出异常,并且测试失败,但它不可能永远成功(这是正确的(,因为您在方法的主体中捕获了异常。

为了抛出异常,您可以简单地拥有:

public String getSpellId(final ContactData contactData) throws SpiderException
{
return someMethod();    
}

但是,请记住,只有someMethod()有效地抛出异常,您的测试才会成功!

现在,让我说一句:这个测试没有任何意义:你在测试getSpellId,但你的业务逻辑在someMethod内部,而且getSpellId接受了一个在体内从未使用过的参数。。。

我建议你改变思考这个问题的方式。

您需要一种可重复、可预测的方法来让您的测试方法抛出异常。实现这一目标的一种方法是通过某些输入。

想象一下你的方法是这样的:

public String getSpellId(final ContactData contactData) throws SpiderException
{
if ( contactData == null ) throw new ArgumentException("input is null")
//some other code
}

这是可重复的,您总是可以通过传递null来触发异常。你知道你的代码应该如何表现,没有不确定性,你可以测试这种行为。

然而,您有另一个方法调用,它可能会失败,但您不知道如何以及为什么会失败。当涉及到单元测试时,这是一个很大的禁忌。

为您的另一个方法添加一个异常测试可能会更好,而不必为这个方法烦恼。

您真正想要避免的是测试对测试中的代码了解过多。你不想为了实现你想要的东西而必须经过谁知道有多少层的测试,因为这会给你留下脆弱的测试,每次代码更改时都需要进行更改。

因此,改变您对代码的思考方式,并致力于使其可测试。此外,如果你想测试一个异常,你必须确保你没有捕捉到那个异常,因为这会隐藏实际的东西。

最新更新