【问题标题】:jUnit + jMock and log4jjUnit + jMock 和 log4j
【发布时间】:2012-01-23 18:15:20
【问题描述】:

我给了一个任务,在其他程序员创建的程序上执行 JUnit + JMock。大多数类都有这个静态字段记录器,即:

static Log logger = LogFactory.getLog(SomeClass.class.getName());

我正在创建一个 SomeClass 的实例,方法是在我的 setUp() 方法中实例化它。当我运行我的 jUnit 类时,我收到以下错误消息:

log4j:ERROR setFile(null,true) call failed.
java.io.FileNotFoundException:  (No such file or directory)

我尝试通过在 setUp() 方法中调用 DOMConfigurator.configure("log4j.xml"); 来进行手动 log4j 配置,但我仍然收到上述相同的错误消息。

问题是:

  • 如何在调用其他使用 LogFactory.getLog 的类的类中运行单元测试 + 模拟
  • 是否应该在我的设置方法中配置 log4j,以便模拟和单元测试无异常运行?
  • 我该怎么做。

【问题讨论】:

    标签: java junit log4j jmock


    【解决方案1】:

    你有两个选择...

    在 Maven 项目中,第二个选项很简单,因为您只需在 test/resources 文件夹中创建一个 log4j.properties。

    【讨论】:

    • 感谢安德鲁的回复。我没有选择使用我需要坚持使用 jMock 的 PowerMock。如果我使用属性文件而不是 xml 版本,我使用 log4j.xml DOMConfigurator.configure 会起作用吗?
    【解决方案2】:

    实际上,我认为有两种类型的问题,一种是 jUnit 中的 log4j 问题。您实际上可以继续使用 jUnit + jMock 即使 log4j 配置不正确,它也会抛出异常但不会停止 jUnit 执行。

    我遇到的问题是:
    1. FileNotFoundException 异常,消息“setFile(null, true) call failed”
    2. jMock 意外调用错误

    我通过放置一个 VM 参数 -Dlog4j.configuration=file:/C:/log4j/log4j.xml 解决了第 1 个问题(即使我仍然可以在出现 log4j 异常的情况下继续进行单元测试)。我遇到了一个异常,因为它使用的是编译目录中的 log4j.xml(编译后的 java 类的默认输出文件夹)。那个 log4j 有这个参数<param name="File" value="${error.file}"/>。所以 log4j 正在寻找一个文件名为 ${error.file} 的日志文件(不存在)。就像我上面所说的,我通过在上面放置一个 VM 参数来解决它。

    经验教训:如果您在执行 log4j 时遇到 FileNotFoundException,请尝试将 -Dlog4j.debug 作为 VM 参数,以查看 log4j 将配置文件拉到哪里。

    我通过完成我正在测试的方法中的所有预期对象来解决第 2 个问题。虽然 jMock 消息有点模棱两可。

    经验教训:意外调用通常意味着您在测试方法中缺少一个对象或模拟对象,这些对象或模拟对象正在您正在单元测试的方法中使用。这也意味着您没有对它试图调用的对象设置期望

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多