Это простой проект, интегрированный с плагином Clover для тестового покрытия. Мы используем Mockito для модульных тестов. версия gradle
------------------------------------------------------------
Gradle 4.10.2
------------------------------------------------------------
Build time: 2018-09-19 18:10:15 UTC
Revision: b4d8d5d170bb4ba516e88d7fe5647e2323d791dd
Kotlin DSL: 1.0-rc-6
Kotlin: 1.2.61
Groovy: 2.4.15
Ant: Apache Ant(TM) version 1.9.11 compiled on March 23 2018
JVM: 1.8.0_241 (Oracle Corporation 25.241-b07)
OS: Linux 4.14.35-1902.10.4.1.el7uek.x86_64 amd64
build.gradle
buildscript {
dependencies {
classpath 'com.bmuschko:gradle-clover-plugin:2.2.3'
}
//....
}
apply from: "${rootDir}/build-support/coverage.gradle"
cover.gradle
apply plugin: 'com.bmuschko.clover'
dependencies {
clover 'org.openclover:clover:4.3.1'
}
clover {
testIncludes = ['**/*Test.java']
report {
html = true
xml = true
}
}
Проблема возникает всякий раз, когда я запускаю ./gradlew clean build без включения cover.gradle , он проходит все тестовые случаи и создает проект. тем не менее, если я включаю охват. gradle , то в некоторых тестовых случаях он будет неудачным. После того, как я откопал немного глубже, обнаружил, что у Mockito есть класс DefaultStubbingLookupListener и бросаем NPE по следующему коду:
private static List<Invocation> potentialArgMismatches(Invocation invocation, Collection<Stubbing> stubbings) {
List<Invocation> matchingStubbings = new LinkedList<Invocation>();
for (Stubbing s : stubbings) {
if (UnusedStubbingReporting.shouldBeReported(s)
&& s.getInvocation().getMethod().getName().equals(invocation.getMethod().getName())
//If stubbing and invocation are in the same source file we assume they are in the test code,
// and we don't flag it as mismatch:
&& !s.getInvocation().getLocation().getSourceFile().equals(invocation.getLocation().getSourceFile())) {
matchingStubbings.add(s.getInvocation());
}
}
return matchingStubbings;
}
по вышеуказанному коду s.getInvocation (). getLocation (). getSourceFile () возвращается в ноль и поэтому выбрасывает NPE на равенство. Хотя без использования клевера ( или без покрытия. Grade ), это дает мне правильную информацию об исходном файле, например, s.getInvocation (). GetLocation (). GetSourceFile () = SomeControllerTest. java
Если я удаляю неудачные тестовые случаи, то с помощью вышеуказанной конфигурации gradle и Clover я получаю файлы colver.db и даже отчет о покрытии также генерироваться. Но эти тестовые случаи не могут быть удалены, поскольку без клевера он работает гладко. Далее я следовал нескольким документам по настройке наборов исходных кодов, но это тот же результат.
Я не могу предоставить полный код тестовых случаев по очевидным причинам, однако ниже приведен фрагмент кода, если он помогает смотреть дальше:
@Test
public void demoTestCaseCodeSnippet() {
ArrayList<String> result = getSomeArrayList();
String s1 = "text1";
String s2 = "text2";
given(commandHelper.getObjectList(any(HashMap.class), eq(String.class), eq("payloadName")))
.willReturn(result);
given(commandHelper.getObject(any(HashMap.class), eq(String.class), eq("payloadName")))
.willReturn(s1);
given(commandHelper.getObject(any(HashMap.class), eq(String.class), eq("payloadName")))
.willReturn(s2); //-----(3)
verify(//some code)
}
Я знаю, что приведенный выше тестовый пример не очень помогает, но, как я уже говорил ранее, Mockito дает мне NPE, потому что sourceFile имеет значение null, я думаю, что это верно для всех тестовых случаев с плагином Clover некоторые тестовые случаи, которые пройдены только потому, что он не запускал приведенный выше фрагмент кода Mockito. Результаты одинаковы и для Gradle версий 4.10.1. Нужны помощь / предложения.