2016-08-09 22 views
7

Tôi có một ứng dụng java 8 với một foo lớp như thế này:Junit báo cáo kiểm tra log

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

public class Foo { 
    private final Logger log = LoggerFactory.getLogger(Foo.class); 

    public String something() { 
     log.info("doing foo test"); 
     return "test"; 
    } 
} 

Mà tôi đang viết một JUnit (Junit 4.11) trường hợp thử nghiệm cho như thế này:

public class FooTest { 
    private Foo foo; 

    @Before 
    public void setUp() throws Exception { 
     foo = new Foo(); 
    } 

    @Test 
    public void testSomething() { 
     String result = foo.something(); 
     assertEquals(result,"test"); 
    } 
} 

Mục tiêu của tôi là viết một trường hợp thử nghiệm để kiểm tra phương thức something cho giá trị trả lại của nó là AND câu lệnh ghi nhật ký để đảm bảo rằng nội dung nào đó đang được ghi lại. Tôi đã dành hàng giờ cọ rửa web để tìm ra cách thiết lập junit để kiểm tra câu lệnh ghi nhật ký. Tôi đã thử phương pháp this, this, thisthis không có kết quả.

Tôi không biết đó có phải là điều tôi đang làm sai hay không. Nhưng đây là mã của tôi dựa trên ví dụ cuối cùng:

public class FooTest { 
    private Foo foo; 
    @Mock private Appender appender; 
    @Captor private ArgumentCaptor captor; 

    @Before 
    public void setUp() throws Exception { 
     foo = new Foo(); 
     MockitoAnnotations.initMocks(this); 
     Logger.getRootLogger().addAppender(appender); 
    } 

    @After 
    public void tearDown() throws Exception { 
     Logger.getRootLogger().removeAllAppenders(); 
    } 

    @Test 
    public void testSomething() { 
     String result = foo.something(); 
     assertEquals(result,"test"); 
     verify(appender).doAppend(((LoggingEvent) captor.capture())); 
     LoggingEvent loggingEvent = (LoggingEvent) captor.getValue(); 
     assertEquals(loggingEvent.getRenderedMessage(), "doing foo test"); 
    } 
} 

Nhưng khi tôi chạy này, tôi nhận được lỗi sau:

Wanted but not invoked: 
appender.doAppend(<Capturing argument>); 
-> at <package>.testSomething(FooTest.java:22) 
Actually, there were zero interactions with this mock. 

Có một cách dễ dàng hơn để thực hiện những gì mà tôi muốn? Nếu đây là cách tốt nhất thì tôi đang làm gì sai?

+1

Gợi ý. Vấn đề của bạn là câu lệnh ** new ** có vị trí trong mã của bạn. Bạn có thể ở đây http://stackoverflow.com/questions/38863913/how-to-unit-test-log-e-in-android để hiểu cách loại bỏ các cuộc gọi đến các phương thức tĩnh hoặc mới trong trường hợp của bạn. Và: để hiểu tại sao ** mới ** gây ra sự cố, bạn có thể muốn xem một số video: https://www.youtube.com/playlist?list=PLD0011D00849E1B79 ... nghiêm túc: mỗi phút đáng để bạn dành thời gian. – GhostCat

+0

Foo có trình ghi nhật ký không được viết hoặc triển khai theo cách mà bạn có thể kiểm tra trình ghi nhật ký của mình. bạn chỉ cần gọi Foo mới, trong đó foo có logger riêng của nó tại thời điểm đó trở đi – kuhajeyan

+1

Có thể trùng lặp của [Làm thế nào để làm một JUnit khẳng định trên một tin nhắn trong một logger] (http://stackoverflow.com/questions/1827677/how-to -do-a-junit-assert-on-a-tin-trong-một-logger) – IanEdington

Trả lời

6

Chắc chắn!

  • Tạo tùy chỉnh của riêng bạn trong bộ nhớ Singleton Appender lớp
  • Sửa đổi các cấu hình thử nghiệm logger để đăng nhập vào appender này, thêm vào tất cả các đăng nhập khác, bạn sẽ làm
  • clear() nó trong mỗi bài kiểm tra @Begin
  • khẳng định - kiểm tra nó bình thường trước khi thử nghiệm kết thúc.

Thực tế, SLF4J đã có an implementation điều này mà bạn có thể xem.

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