当前位置: 首页 > 知识库问答 >
问题:

Strategy-Pattern:当不是所有方法都抛出异常时,针对JUnit中特定测试的Surppress异常警告

狄溪叠
2023-03-14

用于说明的代码:

public Interface FlightBehaviour {
    void fly();
}

public class Fly implements FlightBehaviour {
    @Override
    public void fly() throws CrashWithObject {
        // does something to fly
    }
}

public class CanNotFly implements FlightBehaviour {
    @Override
    public void fly() {
        // does not fly
    }
}

public class Bird() {
    private FlightBehaviour fly;
    
    public void setFlightBehaviour(FlightBehaviour flightBehaviour) {
        this.car = car;
    }

    @Override
    public void fly() throws CrashWithObject {
        car.fly();
    }
}

JUnit:

@Test
public void testFlighBehaviourOfNonFlyingBird() {
    // ...
    Bird plasticDuck = new Bird();
    plasticDuck.setFlightBehaviour(new CanNotFly());
    plasticDuck.fly(); //Compiler shows that an Exception is thrown
    // However, I know that this will never happen since my Bird can't fly 
    // and therefore never throws an exception
    // ...
}

这是我实现的简单复制。我用的是你能看到的策略模式。

我的问题是:我怎样才能压制所发出的警告?

共有1个答案

潘胤
2023-03-14

在测试用例中,您不应该假设不能抛出异常,而是要测试它(在出现异常的情况下使测试失败,也许是在试图引发异常之后)。

对于您的(基于策略模式的)代码结构,编译器几乎不可能推断出不会抛出异常。作为人类,我们已经面临着一项艰难的推理工作(忽略代码中的几个错别字):

  • bird.fly()方法仅在fly.fly()抛出CrashWithObject时才抛出。
  • Fly最近在PlasticDuck.SetFlightBehavior(新的CanNotFly())中设置为CanNotFly
  • CanNotFly.Fly()不会引发CrashWithObject
  • 很可能,setFlightBehavior()不会在其他任何地方为这个Bird实例调用,但这需要对整个应用程序进行透彻的分析才能真正确定这一点。
  • 因此,我们希望Fly字段在调用PlasticDuck.Fly()时仍然保留CanNotFly的实例,这允许我们得出结论,即不能抛出CrashWithObject

您知道,它需要在不同的代码片段之间进行大量的非平凡的推理来得出无异常结论,这种推理的深度我不希望在编译器中很快就能看到。

 类似资料:
  • 我正试图为一个方法编写一个测试用例,该方法基于特定的逻辑抛出异常。然而,测试用例失败了,因为预期的异常和获得的异常是不同的。 我如何解决这个问题?

  • 问题内容: 假设我开发了一个扩展,该扩展不允许测试方法名称以大写字符开头。 现在,我要测试我的扩展程序是否按预期工作。 如何编写测试以验证尝试执行第二种方法是否抛出带有特定消息的RuntimeException? 问题答案: 在尝试了答案中的解决方案和注释中链接的问题之后,我最终使用了JUnit Platform Launcher解决方案。 JUnit本身不会运行,因为它是不带的内部类。因此,在构

  • 问题内容: 我有这样的方法: 我想抛出一个内。编译器不允许我这样做,因为不允许将我的方法扔在那里。但是我需要抛出一个的子类来进行测试 (我不能抛出Unchecked)。显然这是一个hack,但我需要进行测试。我尝试过EasyMock,但它也不允许我这样做。任何想法如何做到这一点? 谢谢,肖恩·阮 问题答案: 方法1: Alexey Ragozin的这篇文章介绍了如何使用泛型技巧引发未声明的检查异常

  • 我正在尝试测试当试图除以零时,是否会抛出带有定制消息的异常。 方法是这样的: 在搜索了一些解决方案后,我发现这是一种做这件事的方法,但是我的IDE不能识别“expected”... 我只是不知道为什么我的 IDE 无法识别“预期”。不知道这是否与 Junit 版本有关,或者我使用的语法是否存在问题。 在我迄今为止使用的所有其他测试中,我从未在@Test之后添加任何内容。我刚刚在另一个线程中找到了类

  • 问题内容: 我对JUnit还是很陌生,我真的不知道对于异常和异常处理有什么最佳实践。 例如,假设我正在为IPAddress类编写测试。它具有一个构造函数IPAddress(String addr),如果addr为null,则将抛出InvalidIPAddressException。据我可以从谷歌搜索中得知,对null参数的测试将如下所示。 在这种情况下,try / catch很有意义,因为我知道异

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