Cảm ơn rất nhiều cho những câu trả lời nhanh chóng và hữu ích này (đáng ngạc nhiên); họ đưa tôi đi đúng hướng cho giải pháp của tôi.
Cơ sở mã mà tôi muốn sử dụng, sử dụng java.util.logging làm cơ chế logger của nó và tôi không cảm thấy ở nhà đủ các mã đó để thay đổi hoàn toàn thành log4j hoặc giao diện / mặt tiền của logger. Nhưng dựa trên những gợi ý này, tôi đã "hack" một phần mở rộng của julhandler và nó hoạt động như một điều trị.
Một bản tóm tắt ngắn gọn sau đây. Mở rộng java.util.logging.Handler
:
class LogHandler extends Handler
{
Level lastLevel = Level.FINEST;
public Level checkLevel() {
return lastLevel;
}
public void publish(LogRecord record) {
lastLevel = record.getLevel();
}
public void close(){}
public void flush(){}
}
Rõ ràng, bạn có thể lưu trữ bao nhiêu tùy thích / muốn / cần từ LogRecord
hoặc đẩy tất cả chúng vào một ngăn xếp cho đến khi bạn nhận được một tràn.
Trong quá trình chuẩn bị cho bài kiểm tra Junit, bạn tạo một java.util.logging.Logger
và thêm một cái mới như vậy LogHandler
vào nó:
@Test tester() {
Logger logger = Logger.getLogger("my junit-test logger");
LogHandler handler = new LogHandler();
handler.setLevel(Level.ALL);
logger.setUseParentHandlers(false);
logger.addHandler(handler);
logger.setLevel(Level.ALL);
Lời kêu gọi setUseParentHandlers()
là để bịt miệng những người xử lý bình thường, để (đối với lần chạy thử nghiệm này) không có đăng nhập không cần thiết xảy ra. Làm bất cứ điều gì mà bài kiểm tra mã của bạn cần để sử dụng bộ ghi này, chạy thử nghiệm và khẳng định:
libraryUnderTest.setLogger(logger);
methodUnderTest(true); // see original question.
assertEquals("Log level as expected?", Level.INFO, handler.checkLevel() );
}
(Tất nhiên, bạn sẽ chuyển phần lớn công việc này thành một @Before
phương thức và thực hiện các loại cải tiến khác, nhưng điều đó sẽ làm lộn xộn bài thuyết trình này.)
logger.getAllAppenders()
, sau đó bước qua và gọiappender.setThreshold(Level.OFF)
từng cái (và đặt lại chúng khi bạn hoàn tất!). Điều này đảm bảo rằng các thông báo "xấu" mà bạn đang cố gắng tạo không hiển thị trong nhật ký kiểm tra và khiến nhà phát triển tiếp theo hoảng sợ.