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

如何对异常进行单元测试?

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

如您所知,异常情况下会引发异常。那么如何模拟这些异常呢?我觉得这是挑战。对于此类代码段:

public String getServerName() {
    try {

        InetAddress addr = InetAddress.getLocalHost();
        String hostname = addr.getHostName();
        return hostname;
    }
    catch (Exception e) {
        e.printStackTrace();
        return "";
    }
}

有人有好主意吗?


问题答案:

其他答案已经解决了如何编写用于检查是否引发异常的单元测试的一般问题。但是我认为您的问题实际上是在询问如何获取代码以首先引发异常。

以您的代码为例。getServerName()在简单的单元测试的环境中,很难在内部引发异常。问题是,为了使异常发生,代码(通常)需要在网络中断的计算机上运行。安排在单元测试中进行该操作可能是不可能的……您需要在运行测试之前故意对计算机进行错误配置。

所以答案是什么?

  1. 在某些情况下,简单的答案只是采取务实的决定,而不是全面测试。您的方法就是一个很好的例子。从代码检查中应该清楚该方法的实际作用。测试它不会证明任何东西(除了下面的内容**)。您要做的只是提高测试次数和测试覆盖率,这两个都不是项目 目标

  2. 在其他情况下,将生成异常的低级代码分离出来并使其成为一个单独的类可能是明智的。然后,要测试更高级别代码对异常的 处理 ,可以用将引发所需异常的模拟类替换该类。

考虑到这种“治疗”,这是您的示例。(这有点做作…)

public interface ILocalDetails {
    InetAddress getLocalHost() throws UnknownHostException;
    ...
}
public class LocalDetails implements ILocalDetails {
    public InetAddress getLocalHost() throws UnknownHostException {
        return InetAddress.getLocalHost();
    }
}
public class SomeClass {
    private ILocalDetails local = new LocalDetails();  // or something ...
    ...
    public String getServerName() {
        try {
            InetAddress addr = local.getLocalHost();
            return addr.getHostName();
        }
        catch (Exception e) {
            e.printStackTrace();
            return "";
        }
    }
}

现在要对此进行单元测试,您将创建ILocalDetails接口的“模拟”实现,该接口的getLocalHost()方法将在适当的条件下引发所需的异常。然后,您为创建一个单元文本SomeClass.getServerName(),安排的实例SomeClass使用您的“
mock”类的实例而不是普通的实例。(最后一点可以使用模拟框架,通过setterlocal属性公开或使用反射API来完成。)

显然,您需要修改代码以使其可测试。而且您可以做的事情有局限性…例如,您现在无法创建单元测试来使真正的LocalDetails.getLocalHost()方法引发异常。您需要根据情况进行判断,以决定是否值得这样做。也就是说,单元测试的好处是否超过了以这种方式使类可测试的工作(以及额外的代码复杂性)。(事实上​​,在此static方法的底部有一个方法是很大一部分问题。)

**这里 一个假设点这种测试。在您的示例中,原始代码捕获到异常并返回空字符串这一事实 可能
是一个错误……这取决于方法API的指定方式……并且假设的单元测试将对其进行提取。但是,在这种情况下,该错误是如此明显,以至于您在编写单元测试时会发现它!并且假设您在发现错误时就对其进行了修复,那么单元测试将变得有些多余。(您不会期望有人重新设置此特定错误……)



 类似资料:
  • 问题内容: 如何在单元测试中测试 hashCode()函数? 问题答案: 每当我覆盖equals和hash代码时,我都会按照Joshua Bloch在“ Effective Java”第3章中的建议编写单元测试。我确保equals和hash代码是自反的,对称的和可传递的。我还确保“不等于”对所有数据成员均正常工作。 当我检查对equals的调用时,我还要确保hashCode的行为符合预期。像这样:

  • 问题内容: 我一直在学习AngularJS,并且在单元测试方面进展非常顺利,但是我遇到了一个棘手的问题。 假设我有一个简单的表格,例如: 如果我正在测试类似控制器的东西,我知道我会这样写(使用Jasmine + Karma): 但是我不知道我需要注入哪些服务,也没有运气在指南或文档中找到有关单元测试的文档。 一个单元如何在Angular中测试表单? 问题答案: 我不认为这是对此类内容进行单元测试的

  • 本文向大家介绍对Angular.js Controller如何进行单元测试,包括了对Angular.js Controller如何进行单元测试的使用技巧和注意事项,需要的朋友参考一下 一、写个简单的Angular App 在开始写测试之前,我们先写一个简单的计算App,它会计算两个数字之和。 代码如下: 二、简单说说里面涉及的一些基本概念: 创建一个 module 什么是angular.modul

  • 在探索如何对Kafka流进行单元测试时,我遇到了,不幸的是,这个类似乎被版本(KAFKA-4408)破坏了 对于KTable的问题,是否有一个解决方案? 我看到了“mocked streams”项目,但首先它使用的是,而我使用的是,其次它是Scala,而我的测试是Java/Groovy。 这里的任何关于如何在不需要引导zookeeper/kafka的情况下对流进行单元测试的帮助都将非常棒。 注意:

  • 单元测试,对独立的代码功能片段,由编写代码的团队进行测试,也是一种编码,而非与之不同的一些事情。设计代码的一部分就是设计它该如何被测试。你应该写一个测试计划,即使它只是一句话。有时候测试很简单:“这个按钮看起来好吗?”,有时候它很复杂:“这个匹配算法可以精确地返回正确的匹配结果?”。 无论任何可能的时候,使用断言检查以及测试驱动。这不仅能尽早发现 bug,而且在之后也很有用,让你在其他方面担心的谜

  • 问题内容: 我正在使用一个Android应用程序,该应用程序是从Web服务下载JSON数据的。解析数据的类如下所示: 当我从应用程序内部调用时,它构建良好并且可以正常工作,但是当我尝试在单元测试中测试此方法时,出现以下异常: 默认情况下,Android框架随附的软件包的类似乎在Java中不可用。 有没有一种方法可以解决此问题,以便可以对解析JSON的类进行单元测试? 问题答案: 您需要做的就是将以