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

测试期望异常,抛出异常(在输出中显示),但是测试仍然失败

何哲
2023-03-14
问题内容

嗨,有一个针对车辆构造函数的测试。该测试会在没有驾驶执照的情况下使用驾驶员对车辆进行初始化,并且应该抛出异常。代码构造函数:

public Voertuig(String Merk, Datum datumEersteIngebruikname, int Aankoopprijs, int Zitplaatsen, Mens bestuurder, Mens ... ingezetenen) {
    this.nummerplaat = div.getNummerplaat();
    this.Zitplaatsen = Zitplaatsen;
    try {

        this.Merk = Merk;
        this.datumEersteIngebruikname = datumEersteIngebruikname;
        this.Aankoopprijs = Aankoopprijs;
        if (!Arrays.asList(bestuurder.getRijbewijs()).contains(Rijbewijs.B) || !Arrays.asList(bestuurder.getRijbewijs()).contains(Rijbewijs.BE)) {
            throw new MensException("Geen correct rijbewijs");
        } else {
            this.bestuurder = bestuurder;
            Ingezetenen.add(bestuurder);
        }
        Mens[] a = ingezetenen;
        if (a.length > Zitplaatsen - 1) {
            throw new MensException("te veel ingezetenen");
        } else {
            for (int i = 0; i < a.length; i++) {
                ingezetenenExclBestuurder.add(a[i]);
                Ingezetenen.add(a[i]);
            }
        }

    } catch (MensException e) {
        System.out.println(e.getMessage());
    } 
}

代码测试:

 @Test(expected = be.vdab.util.mens.MensException.class)
    public void test_constructor_zonder_Rijbewijs() {
     //VOERTUIG B,BE//bestuurder:---
        Voertuig voertuig = new TestVoertuig("auto", datum, 18300, AANTAL_INZITTENDEN, INGEZETENE_A);
}

当我运行此重点测试方法时,这就是结果。

-------------标准输出---------------

吉恩正确的rijbewijs

Testcase: Testcase: test_constructor_zonder_Rijbewijs(be.vdab.voertuigen.VoertuigTest): FAILED
Expected exception: be.vdab.util.mens.MensException
junit.framework.AssertionFailedError: Expected exception: be.vdab.util.mens.MensException

因此,根据输出,捕获并显示了异常,但测试失败。有人知道为什么吗?提前致谢。

编辑:我通过不包括try-catch块来解决它,而只是抛出了异常,导致不得不在创建对象的每个测试方法中添加“ throws
MensException”。我通过调整自定义MensException来解决此问题,而不是扩展Exception而不是扩展RuntimeException,因此我不必在每个测试方法中都添加“
throws MensException”。


问题答案:

在您的方法中,您正在捕获异常并记录消息(这是一种不好的做法,应记录堆栈跟踪),并且在测试中您声明测试的执行 必须
抛出a,be.vdab.util.mens.MensException而不会被捕获。

只是重新抛出它,或者根本不将其捕获在要测试的方法/构造函数中。

选项1:

public Voertuig(/*  ...your arguments here... */) {
    this.nummerplaat = div.getNummerplaat();
    this.Zitplaatsen = Zitplaatsen;
    try {
        //...
        //code in the try...
        //...
    } catch (MensException e) {
        //System.out.println(e.getMessage());
        //use a logger, not System.out
        //in case you still want to use System.out
        //then at least use the code shown below
        //e.printStackTrace(System.out);
        //line above commented since there's no need to log
        //and rethrow the exception
        //the exception will be handled by the highest level execution
        //and there it should be logged or use another strategy
        throw e;
    } 
}

选项2:

public Voertuig(/*  ...your arguments here... */) {
    this.nummerplaat = div.getNummerplaat();
    this.Zitplaatsen = Zitplaatsen;
//remove the try
//    try {
    //...
    //code in the try...
    //...
//remove the catch
//    } catch (MensException e) {
//        System.out.println(e.getMessage());
//    } 
}

IMO我将使用选项2而不是选项1。



 类似资料:
  • 我用Spock测试Java代码。我测试这段代码: 我写了一个测试: 它失败是因为抛出了另一个CustomException。但是在块中,我捕获这个异常并抛出一个,因此我希望我的方法将抛出,而不是。如何测试它?

  • 由于一个我不知道的事件,调用在我的Ubuntu18.04中不再起作用。(自4月开始运行)。或I阶段尝试的任何其他生命周期都运行良好。 例如,如果我在克隆到中的Apache Commons IO的最新版本中运行,If显示 target/surefire-reports包含以下内容的许多重复 我尝试的任何其他项目都表现出类似的行为。 我尝试下载maven 3.5.4,解压缩它,通过将它添加到路径中,并

  • 我知道一种方法是: 有什么更干净的方法吗?(可能使用JUnit的?)

  • 我正在编写一个异步测试,它期望异步函数抛出如下所示: 但jest只是不及格而不是通过测试: null null

  • 我有一个方法: 这是用户授权测试的样子: 有没有办法检查用户输入错误密码的情况?因为在我发送错误密码的情况下,它不起作用,因为 使在你检查密码之前返回结果。

  • 我在StackOverflow中搜索了相同类型的问题,并检查了每个响应,但仍然面临这个问题。我正在测试从名为readStream()的方法抛出的IOException,该方法确实抛出了IOException,但Junit使用AssertionException使测试失败。 下面是我的单元测试: 如您所见,我已经尝试让原始类中的异常实际抛出异常,而不是仅仅捕获并打印堆栈跟踪: 我还尝试使用注释@te