Define how to compute new measures on some metrics declared by
org.sonar.api.measures.Metrics.
This interface replaces the deprecated class org.sonar.api.batch.Decorator.
How to use
public class MyMeasureComputer implements MeasureComputer {
@Override
public MeasureComputerDefinition define(MeasureComputerDefinitionContext defContext) {
return defContext.newDefinitionBuilder()
// Input metrics can be empty, for instance if only issues will be read
.setInputMetrics("ncloc")
// Output metrics must contains at least one metric
.setOutputMetrics("my_new_metric")
.build();
}
@Override
public void compute(MeasureComputerContext context) {
int ncloc = context.getMeasure("ncloc");
List<Issue> issues = context.getIssues();
if (ncloc != null && !issues.isEmpty()) {
double value = issues.size() / ncloc;
context.addMeasure("my_new_metric", value);
}
}
}
How to test
public class MyMeasureComputerTest {
MyMeasureComputer underTest = new MyMeasureComputer();
@Test
public void test_definition() {
TestMeasureComputerDefinitionContext defContext = new TestMeasureComputerDefinitionContext();
MeasureComputerDefinition def = underTest.define(defContext);
assertThat(def).isNotNull();
assertThat(def.getInputMetrics()).containsOnly("ncloc");
assertThat(def.getOutputMetrics()).containsOnly("my_new_metric");
}
@Test
public void sum_ncloc_and_issues() {
TestMeasureComputerContext context = new TestMeasureComputerContext(underTest);
context.addMeasure("ncloc", 2);
context.setIssues(Arrays.asList(new TestIssue.Builder().setKey("ABCD").build()));
underTest.compute(context);
assertThat(context.getMeasureValue("my_new_metric")).isEqualTo(0.5);
}