当前位置: 首页 > 面试题库 >

JUnit 4预期异常类型

范飞翰
2023-03-14
问题内容

我正在尝试对其他人编写的代码进行JUnit测试,但是我无法弄清楚如何测试该异常,因为该异常似乎缺少类型。

public Pirate(String name, int initialGold) throws Exception {
    if(initialGold < 0)
        throw new Exception("Init Gold must be >= 0");
    this.name = name;
    this.numGold = initialGold;
    this.health = Pirate.DEFAULT_HEALTH;
    this.isCursed = false;
}

我的JUnit代码段:

@Test
public static void constructorTest() throws Exception{
    rodgers = new Pirate("Dread Pirate Rodgers", 10000);
    assertEquals("Dread Pirate Rodgers" , rodgers.getName());
    assertEquals(10000, rodgers.getNumGold());
    assertEquals(100, rodgers.getHealth());
    assertEquals(false, rodgers.getIsCursed());
}

@Test()
public static void exceptionTest() throws Exception{
    rodgers = new Pirate("Dread Pirate Rodgers" , -100);

}

我知道我需要在测试的括号中加上期望的=(某种异常类型),但是对于异常类型我一无所知。


问题答案:

实际上,@Test(expected=Xyz.class)在JUnit
4.7中有一个替代方法是使用RuleExpectedException

在测试用例中,您声明ExpectedException带有@Rule,并为其指定默认值ExpectedException.none()。然后,在预期异常的测试中,将值替换为实际预期值。这样做的好处是,无需使用难看的try
/ catch方法,您就可以进一步指定异常中的消息是

@Rule public ExpectedException thrown= ExpectedException.none();

@Test
public void myTest() {
    thrown.expect( Exception.class );
    thrown.expectMessage("Init Gold must be >= 0");

    rodgers = new Pirate("Dread Pirate Rodgers" , -100);
}

使用此方法,您可能能够在通用异常中测试消息是否是特定的。

附加使用的
另一个优点ExpectedException是,您可以在测试用例的上下文中更精确地确定异常的范围。如果仅@Test(expected=Xyz.class)在测试中使用批注,则可以在测试代码中的任何位置引发Xyz异常-
包括测试方法中的任何测试设置或预声明。这可能导致误报。

使用ExpectedException,您可以推迟指定,thrown.expect(Xyz.class)直到在任何设置和预声明之后才实际调用被测方法之前。因此,您可以更准确地确定实际方法调用而不是测试夹具本身抛出的异常的范围。

JUnit 5注:

的JUnit
5的JUnit木星除去@Test(expected=...)@RuleExpectedException完全。它们被new替换assertThrows(),这需要使用Java
8和lambda语法。 ExpectedException仍可通过JUnit Vintage在JUnit 5中使用。此外,JUnit
Jupiter也将ExpectedException通过使用junit-jupiter-
migrationsupport模块继续支持JUnit
4
,但前提是您添加了附加的类级注释@EnableRuleMigrationSupport



 类似资料:
  • 这个测试通过了,因为它得到的是nullpointerexception,但是,显然存在一个带有asserTrue(false)的断言错误,因此我希望它失败。 解决这个问题的最好方法是什么?解决这个问题的方法可能是下面的,但我不知道这是否是正确的方法。 第二次测试如预期的那样失败了。

  • 主要内容:1 概述,2 JUnit 4异常测试示例,3 结论1 概述 在本指南中,我们将学习如何测试具有意外条件的方法引发的异常。 2 JUnit 4异常测试示例 有三种方法可以处理异常。 预期的异常 ExpectedException规则 Try/Catch Idiom 2.1 预期的异常 您如何验证代码是否按预期抛出异常?验证代码能否正常完成很重要,但是确保代码在异常情况下的行为也很重要。例如: 此代码应引发IndexOutOfBoundsExcept

  • 主要内容:1. 运行时异常,2. 检查异常在本教程中,我们将演示如何使用TestNG expectedExceptions来测试代码中的预期异常抛出。 创建一个名称为 ExpectedExceptionTest 的 Maven 工程,其结构如下所示 - 1. 运行时异常 此示例显示如何测试运行时异常。 如果方法抛出一个运行时异常 — ,它会获得通过。 创建一个测试文件:TestRuntime.java ,其代码如下所示 - 运行上面代码,

  • java.lang.AssertionError:预期测试将在org.junit.Assert.Fail(Assert.java:88)在org.junit.rules.ExpectedException.FailduetOmissingException(ExpectedException.java:263)在org.junit.rules.ExpectedException.Access$20

  • 我正在尝试使用Spring数据执行一个IN查询。我的模型如下所示: 我的仓库界面是这样的: } 问题是当我尝试执行此代码

  • 我不熟悉GSON和改装,这是我的输出模型(仅供参考结构), 这是我的输出 这是我的改装代码 应为BEGIN_对象,但为BEGIN_数组“ 我尝试过用List替换RootObject