JUnit文件
public class SomeClassTest {
...
@Test
public void testSomeContextFailure() throws Exception {
SomeClass sc = new SomeClass();
try {
sc.SomeContext(null,null);
fail("IllegalArg expected");
} catch (IllegalArgumentException e) {}
}
@Test
public void testSomeContextSuccess() throws Exception {
SomeClass sc = new SomeClass();
SomeContext in = new SomeContext();
in.setName("something");
in.setId("5");
in.setPoints(SomePoint.X);
try {
assertNotNull(sc.SomeContext(in,null));
} catch (Exception e) {}
}
}
Java文件
public class SomeClassTest {
@Autowired(required = true)
private InsuredDAO insuredDAO;
@Override
public context SomeContext(context c, unused u) throws Exception {
if(c == null)
throw new IllegalArgumentException();
insuredDAO.increaseValue(c);
if(c.getPoints() != null) {
...do something
}
return c;
}
在java文件中,if(c == null)
突出显示为黄色,并显示消息说未覆盖2个分支中的1个。
throw new IllegalArgumentException();
突出显示绿色
insuredDAO.increaseValue(c);
此行上下的所有内容均为红色
我错过了什么? (JUnit测试既传递了,但为什么它没有被覆盖)?
答案 0 :(得分:1)
可能有点太晚了,但是如果有人遇到这个......
第一:
您有两个测试,其中一个失败。作为唯一的测试,测试了" null"值,eclemma将if语句标记为"部分覆盖"。 - > null check已经过测试,但是对于给定的Object,它不是。
它不像调试器那样工作,测试一直运行到这一行,然后它失败了,但是直到这个阶段所做的一切都将被分析"。 eclemma只是分析完全运行(和成功)的测试
第二:
在您的班级中,您有insuredDAO.increaseValue(c);
,这是自动装配的。在我的测试中,我必须模拟这个Object,否则它将在该行失败,因为自动装配不是在junit测试中完成的,因此NullPointerException
为空,方法调用将抛出{insuredDAO
1}}。
但是应该在你的IDE中弹出;)