JUnit测试断言

时间:2017-05-11 22:08:10

标签: java junit

我需要为以下代码构建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++;
    }
   }
 }

1 个答案:

答案 0 :(得分:2)

我不会使用Java的断言来防范null引用,主要是因为该功能可以 - and by default is - 关闭。如果您的测试系统启用了断言且您的生产系统没有启用断言,这可能导致真正难以发现的错误。

相反,为此,我会使用Guava PreconditionsApache 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!");
}