4

我的任务是在其他程序员创建的程序上执行 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)

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

问题是:

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

2 回答 2

4

你有两个选择...

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

于 2012-01-23T19:11:55.897 回答
2

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

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

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

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

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

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

于 2012-01-24T19:06:02.857 回答