2012-01-23 63 views
4

我已经给出了一个任务,对其他程序员创建的程序执行JUnit + JMock。班里大部分学生有这个静态字段记录仪,即:jUnit + jMock和log4j

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

我通过实例它我setUp()方法内创建SomeClass的的一个实例。当我运行我的JUnit类我收到此错误信息:

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

我试图通过调用DOMConfigurator.configure("log4j.xml");setUp()方法内做人工log4j的配置,但我仍然得到上述同样的错误消息。

的问题是:

  • 我如何运行我的单元测试+中调用使用LogFactory.getLog
  • 我应该配置log4j我的设置方法里面,这样其他类的类嘲讽嘲笑和单元测试运行没有例外?
  • 我该怎么做。

回答

1

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

,我已经是这个问题:
1. FileNotFoundException异常异常与信息 “setFile(NULL,TRUE)调用失败”
2. JMock的意外调用错误

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

获得的经验:如果在log4j执行中获得FileNotFoundException,请尝试将-Dlog4j.debug作为VM参数,以查看log4j在何处拉取配置文件。

我通过完成我正在测试的方法内部的所有预期对象来解决数字2。虽然jMock的消息有点含糊不清。

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

4

你有两个选择......

在Maven项目,第二个选择是容易的,因为你只需要在您的测试/资源文件夹中创建一个log4j.properties。

+0

感谢您的答复安德鲁。我没有选择使用PowerMock,我需要坚持使用jMock。如果我使用属性文件而不是xml版本,我使用log4j.xml会使DOMConfigurator.configure工作吗? – Zorlac

+0

伙计们,我解决了我的问题。感谢您的回应。 – Zorlac