无法在单元测试中解决类型错误

时间:2018-12-11 22:07:40

标签: java junit compiler-errors

我有一个相对简单的单元测试,用于测试Java应用程序中的静态方法。

@Test(expected=MyException.class)
public void testGetWeightedGradeWithWeightSumLessThan100(){   
   Pair<Integer, Double> gradeOne = Pair.of(10, 80.00);   
   Pair<Integer, Double> gradeTwo = Pair.of(25, 90);
   @SuppressWarnings({"unchecked", "unused"})
   double weightedGrade = GradeUtils.getWeightedGrade(gradeOne, gradeTwo);
}

这很好用,我的测试通过了预期的结果。但是,我不需要将getWeightedGrade的输出分配给变量,因为我希望方法运行时会引发异常。因此,我尝试如下更新单元测试:

@Test(expected=MyException.class)
public void testGetWeightedGradeWithWeightSumLessThan100(){   
   Pair<Integer, Double> gradeOne = Pair.of(10, 80.00);   
   Pair<Integer, Double> gradeTwo = Pair.of(25, 90);
   @SuppressWarnings({"unchecked", "unused"})
   GradeUtils.getWeightedGrade(gradeOne, gradeTwo);
}

这会导致编译器错误:

GradeUtils.getWeightedGrade cannot be resolved to a type.

当我将excludeWarnings注释移到方法主体之外时,它可以正常编译。

@Test(expected=MyException.class)
@SuppressWarnings({"unchecked", "unused"})
public void testGetWeightedGradeWithWeightSumLessThan100(){   
   Pair<Integer, Double> gradeOne = Pair.of(10, 80.00);   
   Pair<Integer, Double> gradeTwo = Pair.of(25, 90);
   GradeUtils.getWeightedGrade(gradeOne, gradeTwo);
}

这没什么大不了的,我只是很好奇为什么删除变量声明时它不能编译。

谢谢

1 个答案:

答案 0 :(得分:0)

您可以在java docs中看到@SurpressWarnings标志仅适用于

  • 类型
  • 字段
  • 方法
  • 参数
  • 构造函数
  • Local_variable

但是没有 double weightedGrade = ...是您试图在方法调用上使用它的方法,这不是有效的目标。

它对双重声明起作用的原因是因为它是一个局部变量。而且它在方法声明之前起作用,因为它也是有效的目标。