【发布时间】:2016-04-20 09:05:36
【问题描述】:
这是使用 Assert.assertTrue(true); 的好习惯还是坏习惯;和 JUnit 测试中的 Assert.fail() 以及为什么?
我知道还有规则 @Test (expected = Exception.class),但是你可以有不止一个异常可以在测试方法上引发,如果你不想为一种测试方法拥有无数测试方法,这个可能是选项。
用例是这样的: 您测试的方法可以引发零个、一个或多个异常(例如,为了简单起见只有一个),并且您想测试调用是好的,所以不应该引发异常,如果你进入 catch 块,你将引发 Assert.fail();那么你想要测试用例什么时候应该引发异常,所以你在 catch 块中调用 Assert.assertTrue(true);说“是的,这就是我想要的”。从测试中,您可以在一种测试方法中看到它何时应该失败,以及当您运行测试时,它是否真的表现得像您想要的那样。
问题是:这是好还是坏的做法?为什么?
public void fooMethod(boolean paramenter) {
if(false) {
throw new Exception();
}
}
@Test
public void testFooMethod() {
try {
myTestedClassMock.fooMethod(true); //should not raise exception
} catch(Exception e) {
Assert.fail();
}
try {
myTestedClassMock.fooMethod(false); //should raise exception
} catch (Exception e) {
Assert.assertTrue(true);
}
}
【问题讨论】:
-
这在programmers.se 上可能会更好,但我看不出断言真实的意义,您可以只写一条评论说“预期”,这可能同样清楚。
-
我个人认为这是不好的做法,对于您的用例,我会编写两个测试方法并适当地命名。如果您有两个例外,那么我希望有三种测试方法。这样你就必须编写更多的测试方法,但你会得到更干净的测试代码,并且意图可以更好地传达(通过方法名称)。
-
学习使用
ExpectedException类。它取代了您所描述的技术以及其中一个答案中给出的基于注释的技术。 -
我知道 ExpectedException,我在我的问题中提到了它。但是如果你的课程有 20 个或更多的方法,并且所有的都有 4 个测试用例,那真的会很混乱。 (我说的是控制器的应用逻辑类,这就是方法这么多的原因,测试类有40个方法没问题..)
-
不,您没有在问题中提到
ExpectedException类。如果你学会使用它,这一切都会变得简单得多。我不是在谈论注释 - 注释现在已经过时了。
标签: java unit-testing junit assertion