我有以下两个junit测试用例:
@Test(expected=NullPointerException.class,timeout=2000)
public void X1()
{
abc.xyz(null);
fail("Car xyz() should throw NullPointerException when adding null items");
}
@Test(expected=NullPointerException.class,timeout=2000)
public void Y1()
{
abc.pqr(null);
fail("Car pqr() should throw NullPointerException when adding null items");
}
我想将上述两个测试用例合并为一个。我应该怎么做呢?
答案 0 :(得分:2)
你真的不希望将这些案例合二为一。他们正在测试完全不同的东西。
在第一次测试中,您使用xyz
测试null
的结果。在您的第二个中,您使用pqr
重新测试null
。如果要检查这些测试的边界条件,这两个测试都可以编写和使用。
如果任一方法的行为发生更改,则在此方案中,您只需重写一个测试。也就是说,如果pqr
突然变为零容忍,并且你在一次测试中将它们联系在一起,那么由于xyz
不是空的,你仍然会因测试而失败 - 宽容。
将这些分开。您既不想也不需要将这些测试用例组合在一起。
答案 1 :(得分:2)
使用属性expected
是一个非常弱的解决方案,因为您无法控制该方法的哪条指令将引发异常。
即使我不理解加入他们的原因......这里有一些解决方案:
JUNIT4
@Test
public void xyzAndPqr(){
try {
abc.pqr(null);
fail("pqr does not throw NullPointerException");
} catch(NullPointerException npe) {};
try {
abc.xyz(null);
fail("xyz does not throw NullPointerException");
} catch(NullPointerException npe) {};
}
注意:catch只接受NullPointerException,因此如果方法抛出其他类型的异常,则测试正确失败
注1:在catch子句中,您可以检查其他条件(消息,原因等)
注意2:如果没有检查剩余的,第一种不正确的方法测试失败。要始终检查所有方法,您可以使用收集器规则。
<强> JUNIT5 强>
import static org.junit.jupiter.api.Assertions.*;
@Test
public void xyzAndPqr(){
assertThrows(NullPointerException.class, () -> abc.pqr(null));
assertThrows(NullPointerException.class, () -> abc.xyz(null));
}
注意:在需要检查其他条件(消息,原因等)的情况下,assertThrows返回有效的凸起Throwable
注1:在没有检查剩余的情况下,测试在第一个不正确的方法中失败。要始终检查所有方法,可以使用AssertAll。
import static org.junit.jupiter.api.Assertions.*;
@Test
public void xyzAndPqr(){
AssertAll(
() -> assertThrows(NullPointerException.class, () -> abc.pqr(null)),
() -> assertThrows(NullPointerException.class, () -> abc.xyz(null))
);
}
使用AssertJ的JUNIT(4和5) (见http://joel-costigliola.github.io/assertj/assertj-core-features-highlight.html#exception-assertion)
import static org.assertj.core.api.Assertions.*;
@Test
public void xyzAndPqr(){
assertThatNullPointerException().isThrownBy( () -> abc.pqr(null) );
assertThatNullPointerException().isThrownBy( () -> abc.xyz(null) );
}
注意:您可以在assertJ中使用流畅的语法:例如添加.withMessage(&#34; ...&#34;)
注1:在没有检查剩余的情况下,测试在第一个不正确的方法中失败。要检查所有方法,可以使用AssertAll(如果在JUnit5中)或断言软断言(在两种情况下)
答案 2 :(得分:0)
同意Makoto认为这样做非常差,并且违反了任何一种最佳做法。同样值得怀疑的是,为什么你的组织会关心单元测试的低水平实施...无论如何......
@Test
public void xyzAndPqr(){
Throwable thrown;
try{
abc.pqr(null);
catch(Throwable e){
thrown = e;
}
//assert thrown
assertThat(thrown,instanceOf(NullPointerException.class));
//assert anything else, null var or create another...
thrown = null;
try{
abc.xyz(null);
catch(Throwable e){
thrown = e;
}
assertThat(thrown,instanceOf(NullPointerException.class));
//assert anything else
如果需要,在它们的公共库中还有一些Apache ExceptionUtils可以获取消息等。
如果您使用的是Java8,那么AssertJ库可以处理这个更清晰的问题,
http://joel-costigliola.github.io/assertj/assertj-core-features-highlight.html#exception-assertion
assertThatNullPointerException().isThrownBy(() -> { abc.pqr(null); })
assertThatNullPointerException().isThrownBy(() -> { abc.xyz(null); })