有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JUnit延迟断言消息创建

我正在使用JUnit断言消息输出一些调试信息:

assertEquals(debugString, a, b);

创建这个字符串的代价很高,我只想在断言失败时创建它。我该怎么做


共 (4) 个答案

  1. # 1 楼答案

    这有点像黑客,但您可以使用iffail模拟所有断言。例如,代替:

    assertEquals(debugString, a, b);
    

    你的测试可能有:

    if (!a.equals(b)) {
        fail (debugString);
    }
    
  2. # 2 楼答案

    您可以捕获断言错误,然后用消息重新播放它。当消息创建移出循环时,我刚刚编写的一些示例代码的速度快了100多倍:

    @Test
    public void shouldHaveCorrectParameters() {
      for(int r = 1; r <= 50; r++) {
        for(int mce = 1; mce <= 64; mce++) {
          Encoder encoder = new Encoder(r, mce);
    
          for(int l = 1; l <= 16384; l++) {
            EncodeParameters params = encoder.determineParameters(l);
            double effectiveRedundancy = (params.n - params.k) * 100 / (double)params.k;
    
            try {
              assertTrue(params.n - params.k >= mce);
              assertTrue(params.n - params.k <= mce * 2);
              assertTrue(effectiveRedundancy >= r);
            }
            catch(AssertionError e) {
              String msg = "redundancy=" + r + "%; minimumCorrectableErrors=" + mce + "; fileLength=" + l + "; k=" + params.k + "; n=" + params.n + String.format("; effectiveRedundancy=%.3f%%", effectiveRedundancy);
    
              throw new AssertionError(msg, e);
            }
          }
        }
      }
    }
    
  3. # 3 楼答案

    您可以使用Hamcrest,它只在AFAIK失败时创建消息

    String x ="x";
    String y="y";
    assertThat(x, is(equalTo(y));
    

    如果发生故障,它会产生

    java.lang.AssertionError: 
    Expected: is "y"
         but: was "x"
    
  4. # 4 楼答案

    为了完整性,一旦JUnit 5可用,您就可以使用函数参数创建消息,只有在断言失败时才会对函数参数进行评估。它的形式可以是这样的:

     assertTrue(() -> expensiveMessage(), testResult == expectedResult);