gpt4 book ai didi

java - IllegalState Sonar 自定义插件中至少存在一个问题

转载 作者:行者123 更新时间:2023-12-01 10:23:26 26 4
gpt4 key购买 nike

我对 Sonar 非常陌生。
我正在尝试制作自己的 Sonar 插件。下载插件示例后,我使用 mvn eclipse:eclipse 使其准备好 Eclipse 并导入到工作区。编译正常。
但我需要向其中添加我自己的规则文件。
为此,我创建了 2 个文件。

MyCustomNLSRuleTest.java

package org.sonar.samples.java.checks;

import org.junit.Test;
import org.sonar.java.checks.verifier.JavaCheckVerifier;

public class MyCustomNLSRuleTest {

@Test
public void check() {
// Verifies that the check will raise the adequate issues with the expected message.
// In the test file, lines which should raise an issue have been commented out
// by using the following syntax: "// Noncompliant {{EXPECTED_MESSAGE}}"
JavaCheckVerifier.verify("src/test/files/MissingCheck.java", new MyCustomSubscriptionRule());
}
}

实际规则在以下 java 文件中提供给我,如下所示 -

MissingCheck.java

public class MissingCheck extends Check 
{

private HashMap<Integer, Integer> lineStringMap;

@Override
public void beginTree(DetailAST aRootAST) {
super.beginTree(aRootAST);
lineStringMap = new HashMap<>();
}

@Override
public int[] getDefaultTokens() {
return new int[] { TokenTypes.STRING_LITERAL};
}

@Override
public void visitToken(DetailAST ast) {
DetailAST parent = ast.getParent();
if (parent != null) {
DetailAST grandpa = parent.getParent();
if (isAnnotation(grandpa.getType())) {
return;
}
}
Integer count = lineStringMap.get(ast.getLineNo());
if (count == null) {
count = new Integer(1);
} else {
count++;
}
FileContents contents = getFileContents();

String[] line = contents.getLines();
if (line.length >= ast.getLineNo()) {
String l = line[ast.getLineNo() - 1];
if (!l.contains("$NON-NLS-" + count + "$")) {
log(ast.getLineNo(), "String_Not_Externalized", new Object[] { ast.getText() });
}
}
lineStringMap.put(ast.getLineNo(), count);
}

/**
* Checks if type is an annotation.
* @param type to check
* @return <code>true</code> if type is an annotation.
*/
private boolean isAnnotation(int type) {
return (type >= TokenTypes.ANNOTATION_DEF && type <= TokenTypes.ANNOTATION_ARRAY_INIT);
}
}

但是,我正在尝试 mvn clean package 这个项目,它给了我错误:

Results :

Tests in error:
MyCustomNLSRuleTest.check:13 » IllegalState At least one issue expected

Tests run: 8, Failures: 0, Errors: 1, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ---------------------------------------------------------------------

知道如何在插件中添加新规则吗?

谢谢!

最佳答案

好吧,看起来你离为java插件编写自定义规则时应该做的事情还很远......首先有几个问题:

现在...让我们首先向您解释一下您当前正在做什么,因为显然根本不清楚。

  • 您创建了一个名为 MyCustomNLSRuleTest.java 的测试文件,理论上它应该对应于名为 MyCustomNLSRule 的规则。请注意,情况可能并非如此,因为您所说的规则是在 MissingCheck.java 文件中提供给您的
  • 您的单元测试使用 JavaCheckVerifier 来验证作为参数提供的文件 "src/test/files/MissingCheck.java" 在以下情况下是否会引发所有预期问题:对其使用规则 MyCustomSubscriptionRule

此时,您根本没有测试您的 MissingCheck,而是将其用作 MyCustomSubscriptionRule 规则的数据...并且这可能是您的主要问题。

但是,如果这确实是您想要实现的目标,则意味着:

  • 您修改了规则 MyCustomSubscriptionRule 以具有与原始示例项目不同的自定义行为。
  • 在文件 MissingCheck.java 上执行时,检查应该会引发问题(有问题的行被注释掉 //Noncompliant {{expected message}})
  • 您的自定义规则不起作用,因为它在进行测试时显然没有出现任何问题。

请查看上面提供的所有链接,了解自定义规则的工作原理、java 插件 API 中提供的功能以及可以使用它实现的功能。

关于java - IllegalState Sonar 自定义插件中至少存在一个问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35456550/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com