【问题标题】:How to combine logging and unit-testing in java?如何在java中结合日志记录和单元测试?
【发布时间】:2013-08-14 07:20:09
【问题描述】:

我刚刚开始了我的第一个 java 玩具项目,但我对应该如何完成存在误解。我正在使用 java.util.logging 和 JUnit4 库。

例如我们有这样的东西:

public class SomeClass {
  private static Logger log = Logger.getLogger(SomeClass.class.getName());
  public static void SomeMethod() {
     try{
       ...some code...
     } catch(Exception e){
         log.warning("Something bad happened");
     }
  }

单元测试将是:

@Test
public void SomeClassTest(){
  SomeClass.SomeMethod();
}

但永远不会有异常,因为我已经在方法中处理过了。

我应该在 catch-block 中生成新的异常吗?或者可能将 junit 与日志记录结合使用不是一个好主意?

【问题讨论】:

  • 您的问题不在于日志记录,而在于异常处理以及何时捕获或不捕获......
  • 我的印象是,您只想测试那些抛出任何不应该出现的异常的方法。

标签: java logging exception-handling junit


【解决方案1】:

用户的角度来看,不抛出异常(如果有的话返回预期值)意味着可以正常工作

所以你应该在方法中使用try - catch logging,当你可以捕获异常并且方法仍然可以正常工作时(当这个错误时做其他事情例如发生但仍返回预期结果或执行假定的操作)。

在这种情况下,单元测试应该检查操作是否正确执行(如果对象处于预期状态并且结果值(在您的情况下为 void)是否正确

如果方法在异常发生时无法执行它应该执行的操作,您应该重新抛出异常(通常不记录它,但这取决于)。

在这种情况下,单元测试应该检查操作是否正确执行(如果对象处于预期状态并且结果值(在您的情况下为 void)是否正确,如果没有异常,并且如果有是一个异常,它应该检查这个异常是否是预期的

【讨论】:

    【解决方案2】:

    如果您想测试是否抛出了异常,则必须重新抛出或不捕获 Exception

    否则你可以单元测试class在异常发生后处于正确的状态,即异常被正确处理。

    我想说另一件事。 不要 catch(Exception e),捕获您期望的特定异常。否则你会以同样的方式处理其他意外的异常,这真的很危险。

    【讨论】:

    • 捕获特定异常是创建更好代码的有用提示!
    【解决方案3】:

    您可以简单地重新抛出捕获的异常:

    public class SomeClass {
        private static Logger log = Logger.getLogger(SomeClass.class.getName());
    
        public static void SomeMethod() {
            try {
                // your stuff
            } catch (Exception e) {
                log.warning("Something happened");
                throw e;
            }
        }
    }
    

    【讨论】:

    • 是的,但希望能找到其他方法,因为这在我看来不够优雅。
    【解决方案4】:

    我应该在 catch-block 中生成新的异常吗?

    没有。不要那样做!你可以测试你现有的代码!当您只想记录消息但不想在调用 someMethod() 的方法中处理它时,不要抛出它!

    将 junit 与日志记录结合使用不是一个好主意吗?

    两者都是好主意,可以毫无问题地一起使用。

    想想如何测试你的方法。我不会修改代码只是为了您可以轻松测试它。因为你想捕获异常并记录是有原因的。

    尝试验证您的测试方法中修改了哪些变量或对象

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-24
      • 1970-01-01
      • 2010-11-13
      • 1970-01-01
      • 2018-07-22
      • 2017-08-03
      • 1970-01-01
      相关资源
      最近更新 更多