2011-11-25 39 views
6

Tôi có một bean mùa xuân có một thành viên logger và tôi sử dụng logger đó để ghi lại một số hành động.
Ngoài ra tôi đã viết một trường hợp thử nghiệm sử dụng SpringJUnit4ClassRunner. Tôi đã cấu hình Log4j với một tập tin thuộc tính và trong mỗi trường hợp thử nghiệm tôi khởi tạo logger với các đặc tính này:Log4j trong trường hợp kiểm tra JUnit

@BeforeClass 
public static void init() { 
    PropertyConfigurator.configure("src/com/config/log4j.properties"); 
} 

khi tôi chạy một thử nghiệm nó mang lại cho tôi một cảnh báo

log4j:WARN No appenders could be found for logger (org.springframework.test.context.junit4.SpringJUnit4ClassRunner). 
log4j:WARN Please initialize the log4j system properly. 
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. 

Tuy nhiên, logger trong đậu của tôi viết thư vào vị trí được chỉ định trong log4j.properties, tức là nó hoạt động tốt. Tại sao log4j lại cho tôi những cảnh báo như vậy?

+0

Như cách bạn có thể chuyển '-Dlog4j.configuration = com/config/log4j.properties' sang JVM. Mã bạn đã đề cập có thể bị xóa. –

Trả lời

5

Tôi nghĩ lý do là mã này trong SpringJUnit4ClassRunner

public SpringJUnit4ClassRunner(Class<?> clazz) throws InitializationError { 
    super(clazz); 
    if (logger.isDebugEnabled()) { 
     logger.debug("SpringJUnit4ClassRunner constructor called with [" + clazz + "]."); 
    } 
    this.testContextManager = createTestContextManager(clazz); 
} 

Nếu bạn không muốn thấy cảnh báo về log4j, Cứ làm như @DN đề nghị chỉ cần thêm log4j.properties tập tin để đường dẫn lớp ứng dụng của bạn, Trong trường hợp nếu bạn sử dụng cấu trúc thư mục maven, hãy thêm tệp log4j.properties vào (src/main/resources) để loại bỏ cảnh báo.

2

Do thực thi Runner chạy trước khi Log4J được khởi tạo.

+0

SpringJUnit4ClassRunner có yêu cầu Log4j không? Nếu có, tôi có thể cấu hình nó như thế nào trước khi thực thi Á hậu? – maks

+0

@maks Không chắc chắn nếu nó được yêu cầu hoặc nếu nó sử dụng một trình bao bọc nhật ký. Có một 'log4j.properties' tại gốc classpath là đủ, mặc dù bạn phải thử nó. –

+0

@maks Commons ghi nhật ký thực sự, nhưng lời khuyên vẫn được áp dụng. –

11

Tôi muốn giữ cấu hình log4j của mình trên đường dẫn lớp mặc định để sử dụng tính năng ghi nhật ký khác nhau với các bài kiểm tra đơn vị & sản xuất. Tôi đã làm việc xung quanh nó bằng cách phân lớp SpringJUnit4ClassRunner và sử dụng một trình khởi tạo lớp tĩnh.

// The new test runner 
public class JUnit4ClassRunner extends SpringJUnit4ClassRunner { 

    static { 
    try { 
     Log4jConfigurer.initLogging("classpath:test/log4jconfig.xml"); 
    } 
    catch(FileNotFoundException ex) { 
     System.err.println("Cannot Initialize log4j"); 
    } 
    } 

    public JUnit4ClassRunner(Class<?> clazz) throws InitializationError { 
    super(clazz); 
    } 
} 

The Change để Test:

@RunWith(JUnit4ClassRunner.class) 
@ContextConfiguration 
@TransactionConfiguration 
@Transactional 
public class LmpDaoImplTest extends AbstractTransactionalJUnit4SpringContextTests { 
... 

Bây giờ log4j được cấu hình trước khi runner thử nghiệm mùa xuân được gọi.

+0

nơi nào bạn đặt điều này trong cấu trúc gói của bạn? –

+0

Tôi giữ điều này trong một dự án riêng biệt (dẫn đến một bình riêng biệt). Theo cách đó tôi có thể sử dụng lại lớp Test Runner giữa các dự án. Do đó, gói cụ thể không liên quan, ngoại trừ nó phải nằm trong classpath của lớp test. – wbdarby

Các vấn đề liên quan