IntelliJ IDEA:忽略代码覆盖中的普通方法

时间:2015-12-22 13:58:30

标签: java intellij-idea junit code-coverage intellij-15

在IntelliJ IDEA 15.0.2中,如何在测试覆盖率测量期间忽略琐碎的getter和setter(平凡的方法)?

// should be measure
public void complex() {
    fancy();
    interesting();
    dropDatabase();
}

// should not be measured
public int getNumber() {
    return this.number;
}

测量每一行将导致75%。仅测量上述方法将导致100%。这些是100%用于测试的代码。

为什么我在互联网上找不到任何相关内容?我是否潜入了不良行为?


更新

此代码也有资格进行测试:

// should also be tested as it contains logic
public Integer getValidationProgress() {
    if (validationProgress == null) {
        validationProgress = 0;
    }
    return validationProgress;
}

3 个答案:

答案 0 :(得分:11)

JetBrains告诉我,目前不可能

  

Andrey Dernov(IntelliJ)1月6日,22:54

     

你好迈克尔,

     

没有设置可以忽略某种方法。

我为此创建了issue

答案 1 :(得分:1)

仍然没有办法做到这一点,这是一件好事。我了解您的痛苦,我也感到。

让我们假设您拥有一个应用程序,如果这些应用程序不适合这些琐碎的安装程序和获取器,那么它将具有100%的代码覆盖率。这意味着您的所有代码都会通过测试套件进行练习,但琐碎的设置器和获取器除外。

这就提出了一个问题,为什么平凡的方法首先存在。如果所有代码都已运行并且未调用方法,则您的100%覆盖率是肤浅的。所有代码都已运行,但并非所有用例都经过测试。这就是代码覆盖范围欺骗的确切原因。

有以下几种情况:

  1. 这些方法永远不会在任何地方调用,因此应将其删除。
  2. 这些方法在某处被调用,但是您没有测试这些用例。在这种情况下,覆盖率应低于100%。
  3. 存在这些方法是因为框架需要它们。在这种情况下,方法是直接与框架集成的代码的一部分,因此无论如何应与其余代码分开。
  4. 与#3类似,但是您不能分离代码,因为框架很愚蠢。对于某些方法而言,这可能是抑制覆盖率的有效案例,但是使用这样的框架,您可能永远都无法达到可接受的覆盖率。
  5. 我感到很痛苦:toString()实现是出于更好的测试失败易读性的唯一原因。仅当测试失败时才使用这些方法。只要测试套件为绿色,它们就永远不会被覆盖。 *耸肩*

答案 2 :(得分:0)

一个更简单的例子:

public abstract class A {
    public static int add(int x, int y) {
        return x + y;
    }
}

这里IntelliJ的报道抱怨A未经测试的构造函数。我必须写一些像傻瓜一样的东西

new A() {};

进入我的测试以进行测试。如果我将这种方法用于帮助类

public final class A {
    private A() {}

    public static int add(int x, int y) {
        return x + y;
    }
}

我需要使用反射来“测试”空代码:

final Class<?> clazz = Class.forName("package.name.of.A");
final Constructor<?> constructor = clazz.getDeclaredConstructors()[0];

constructor.setAccessible(true);
constructor.newInstance();

看起来并不那么聪明。