19

In IntelliJ IDEA 15.0.2 how can I ignore trivial getters and setters (trivial methods) during test coverage measurement?

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

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

Measuring every line would result in 75%. Measuring only the above method would result in 100%. And those are 100% of the code useful for testing.

How come I don't find anything about that on the Internet? Am I diving into bad practice?


UPDATE

This code is also eligible for testing:

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

3 回答 3

17

JetBrains 告诉我,目前这是不可能的

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

你好迈克尔,

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

我为此创建了一个问题

于 2016-01-06T20:16:06.927 回答
2

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

假设您有一个应用程序,如果没有这些琐碎的 setter 和 getter,它将具有 100% 的代码覆盖率。这意味着除了琐碎的 setter 和 getter 之外,您的所有代码都可以通过您的测试套件来执行。

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

有以下几种情况:

  1. 这些方法永远不会在任何地方调用,因此应该被删除。
  2. 这些方法在某处被调用,但您没有测试这些用例。在这种情况下,覆盖率低于 100%。
  3. 这些方法在那里是因为框架需要它们。在这种情况下,方法是直接与框架集成的代码的一部分,因此无论如何都应该与其余代码分开。
  4. 像#3,但你不能分离代码,因为框架很愚蠢。这可能是抑制某些方法的覆盖率的有效案例,但使用这样的框架,您可能永远无法达到可接受的覆盖率。
  5. 情况是我感到痛苦: toString() 实现的唯一原因是为了更好地阅读测试失败。这些方法只有在测试失败时才会使用。只要测试套件是绿色的,它们就永远不会被覆盖。*耸耸肩*
于 2019-09-03T08:04:44.507 回答
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();

这看起来并不聪明。

于 2017-01-20T13:57:52.370 回答