ฉันจะกำหนดค่า log4j ในคลาสทดสอบ JUnit ได้ที่ไหน


85

เมื่อดูกรณีทดสอบ JUnit ล่าสุดที่ฉันเขียนฉันเรียกว่าวิธี BasicConfigurator.configure () ของ log4j ภายในตัวสร้างคลาส ทำงานได้ดีสำหรับการรันคลาสเดียวนั้นจากคำสั่ง "run as JUnit test case" ของ Eclipse แต่ฉันรู้ว่ามันไม่ถูกต้อง: ฉันค่อนข้างแน่ใจว่าชุดทดสอบหลักของเราเรียกใช้คลาสเหล่านี้ทั้งหมดจากกระบวนการเดียวดังนั้นการกำหนดค่า log4j ควรจะเกิดขึ้นที่ใดที่หนึ่ง

แต่ฉันยังคงต้องเรียกใช้กรณีทดสอบด้วยตัวเองในบางครั้งซึ่งในกรณีนี้ฉันต้องการกำหนดค่า log4j ฉันควรวางการเรียกการกำหนดค่าไว้ที่ใดเพื่อให้รันเมื่อกรณีทดสอบทำงานแบบสแตนด์อโลน แต่ไม่ใช่เมื่อกรณีทดสอบถูกเรียกใช้เป็นส่วนหนึ่งของชุดใหญ่


ฉันจะถือว่า log4j 1.x ที่นี่ไม่ใช่ 2 ...
rogerdpack

คำตอบ:


51

LogManagerกำหนดระดับที่กำหนดค่า log4j ใช้ในบล็อกแบบคงที่ซึ่งจะทำงานเมื่อเรียนที่มีการโหลด มีสามตัวเลือกสำหรับผู้ใช้ปลายทาง:

  1. หากคุณระบุlog4j.defaultInitOverrideเป็นเท็จจะไม่กำหนดค่า log4j เลย
  2. ระบุพา ธ ไปยังไฟล์คอนฟิกูเรชันด้วยตัวคุณเองและแทนที่การค้นหาคลาสพา ธ คุณสามารถระบุตำแหน่งของไฟล์คอนฟิกูเรชันได้โดยตรงโดยใช้อาร์กิวเมนต์ต่อไปนี้เพื่อjava:

    -Dlog4j.configuration=<path to properties file>

    ในการกำหนดค่านักวิ่งทดสอบของคุณ

  3. อนุญาตให้ log4j สแกน classpath สำหรับไฟล์ config log4j ระหว่างการทดสอบของคุณ (ค่าเริ่มต้น)

ดูเอกสารออนไลน์ด้วย


จะรู้ได้อย่างไรว่าเป็น "ไฟล์กำหนดค่า log4j" ชื่อไฟล์คืออะไร? (log4j.xml?)
ชาด

1
@ ชาด: ฉันแก้ไขคำตอบเพื่อตอบคำถามของคุณแล้ว โปรดดูลิงก์ไปยังบล็อกแบบคงที่เพื่อดูว่ามีการใช้งานอย่างไร
Paul Morie

ฉันใช้ log4j2 และฉันต้องใช้การตั้งค่าต่อไปนี้เพื่อระบุไฟล์: -Dlog4j.configurationFile=log4j2.xml. นอกจากนี้ถ้าคุณกำลังพยายามที่จะแก้ปัญหาการโหลด / -Dlog4j2.debug=trueการเริ่มต้นการตั้งค่านี้จะมีประโยชน์:
Kent

มีวิธีใดที่จะระบุคำตอบนี้ให้เฉพาะเจาะจงมากขึ้น
markthegrea

61

โดยทั่วไปฉันเพียงแค่ใส่ไฟล์ log4j.xml ลงใน src / test / resources และปล่อยให้ log4j ค้นหาด้วยตัวเอง: ไม่ต้องใช้รหัสการเริ่มต้น log4j เริ่มต้นจะรับมัน (ปกติแล้วฉันต้องการตั้งค่าคนตัดไม้ของตัวเองเป็น 'DEBUG' อยู่ดี)


6
สำหรับการทดสอบอาคารมาตรฐานฉันจะตั้งค่า Log4j เป็นคำเตือนหรือแม้แต่ข้อผิดพลาด หากการทดสอบประสบความสำเร็จ (รวมถึงการทดสอบเชิงลบ) ไม่ควรมีการบันทึกซึ่งจะได้รับความสนใจจากผู้ใช้
keiki

2
ใช่ใช่แล้วสำหรับ log4j 1.x สำหรับ log4j2 เห็นได้ชัดว่าคุณสามารถใช้ไฟล์ "แปลกใหม่" ได้มากขึ้นเช่นไฟล์ log4j2-test.properties ... logging.apache.org/log4j/2.x/manual/configuration.html :)
rogerdpack

6

คุณอาจต้องการตรวจสอบ เข้าสู่ระบบซุ้มง่ายสำหรับ Java (SLF4J) เป็นซุ้มที่ล้อมรอบ Log4j ที่ไม่ต้องเรียกใช้การตั้งค่าเริ่มต้นเช่น Log4j นอกจากนี้ยังค่อนข้างง่ายที่จะเปลี่ยน Log4j สำหรับ Slf4j เนื่องจากความแตกต่างของ API มีน้อยมาก


5

ฉันใช้คุณสมบัติของระบบใน log4j.xml:

...
<param name="File" value="${catalina.home}/logs/root.log"/>
...

และเริ่มการทดสอบด้วย:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.16</version>
    <configuration>
        <systemProperties>
            <property>
                <name>catalina.home</name>
                <value>${project.build.directory}</value>
            </property>
        </systemProperties>
    </configuration>
</plugin>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.