IllegalState Sonar自定义插件中至少有一个问题

时间:2016-02-17 12:19:26

标签: java maven plugins sonarqube

我是Sonar的新手 我正在尝试为声纳制作自己的插件。下载插件示例后,我使用mvn 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] ---------------------------------------------------------------------

任何想法,我如何在插件中添加新规则?

谢谢!

1 个答案:

答案 0 :(得分:1)

好吧,在编写java插件的自定义规则时,你似乎离你应该做的很远......首先要提出几个问题:

现在......让我们首先向您解释您目前正在做什么,显然它根本不清楚。

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

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

但是,如果这实际上是你想要实现的,那就意味着:

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

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