gpt4 book ai didi

java - 测试预期会出现异常,但抛出了异常(它显示在输出中),但测试还是失败了

转载 作者:行者123 更新时间:2023-12-01 22:29:26 25 4
gpt4 key购买 nike

您好,这里有一个针对车辆构造函数的测试。该测试用没有驾驶执照的驾驶员初始化车辆,并且应该抛出异常。代码构造函数:

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 block 而只是抛出异常来修复它,从而导致必须在创建对象的每个测试方法中添加“throws MensException”。我通过调整自定义 MensException 解决了这个问题,我没有扩展 Exception,而是扩展了 RuntimeException,这样我就不必在每个测试方法中添加“抛出 MensException”。

最佳答案

在您的方法中,您捕获异常并记录消息(这是一个不好的做法,您应该记录堆栈跟踪),并且在您的测试中您声明测试的执行必须抛出一个 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。

关于java - 测试预期会出现异常,但抛出了异常(它显示在输出中),但测试还是失败了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28118207/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com