我需要为以下代码构建Junit测试用例,并且我尝试让其中一个测试测试assert s1 != null : "Violation of: s1 is not null";
,assert s2 != null : "Violation of: s2 is not null";
和assert s1.length() >= 1 : "|s1| >= 1";
语句在出现错误时传递空序列或s1
的长度>> 1。
我不知道这样做的确切方法。
一些论坛建议使用“Try Catch”,但我不确切知道它是如何工作的。
任何帮助将不胜感激!
public static void itersmooth(Sequence<Integer> s1, Sequence<Integer>
s2){
assert s1 != null : "Violation of: s1 is not null";
assert s2 != null : "Violation of: s2 is not null";
assert s1.length() >= 1 : "|s1| >= 1";
s2.clear();
if (s1.length() > 1){
int inp1 = 1;
for (int inp2 = 0; inp2 < (s1.length() - 1); inp2++){
int valone = s1.remove(inp2);
int valtwo = s1.remove(inp1 - 1);
int valoneT = valone / 2;
int valtwoT = valtwo / 2;
int valtemp = valoneT + valtwoT;
if ((valone % 2 != 0 || valtwo % 2 != 0) && (valone > 0 && valtwo > 0)) {
valtemp++;
}
if ((valone % 2 != 0 || valtwo % 2 != 0) && (valone < 0 && valtwo < 0)){
valtemp--;
}
s2.add(inp2, valtemp);
s1.add(inp2, valone);
s1.add(inp1, valtwo);
inp1++;
}
}
}
答案 0 :(得分:2)
我不会使用Java的断言来防范null
引用,主要是因为该功能可以 - and by default is - 关闭。如果您的测试系统启用了断言且您的生产系统没有启用断言,这可能导致真正难以发现的错误。
相反,为此,我会使用Guava Preconditions或Apache Commons Validate之类的前置条件库。除此之外,我还会使用"NotNull" annotation注释方法参数,例如javax.annotation.Nonnull
,以便客户端代码在现代IDE中获得编译时保护。
因此,方法签名和保护条件将变为这样(使用Commons Validate):
import org.apache.commons.lang3.Validate;
import javax.annotation.Nonnull;
//...
public static void itersmooth(@Nonnull Sequence<Integer> s1,
@Nonnull Sequence<Integer> s2) {
Validate.notNull(s1, "Violation of: s1 is not null");
Validate.notNull(s2, "Violation of: s2 is not null");
Validate.isTrue(s1.length() >= 1, "|s1| >= 1");
// ...
}
完成此更改后,编写单元测试非常简单,因为保证NullPointerException
失败notNull
检查或IllegalArgumentException
失败isTrue
1}}检查;你不必担心断言被启用与否。
检查传入的第一个参数不能为null
的示例测试如下所示:
@Test(expected=NullPointerException.class)
public void throwsWhenFirstSequenceIsNull() {
MyClass.itersmooth(null, new Sequence<Integer>(1,2,3));
Assert.fail("Null argument didn't cause an exception!");
}