2017-06-12 68 views
1

我有一個測試,我想從測試中記錄一些信息。我設法使用基本的java記錄器,但我做錯了什麼。每個後續的條目日誌消息都會相乘,即。第一條消息記錄一次,第二次兩次,第三次三次,等等,我不知道我做錯了什麼。消息也被推送到控制檯,但只有一次。爲什麼每個後續的日誌條目都重複使用(使用java.util.logging)?

public class MyExampleTest { 
    private FileHandler fh = null; 
    private static final Logger logger = Logger.getLogger(MyExampleTest.class.getName()); 
    SimpleFormatter formatter = new SimpleFormatter(); 

    @Test 
    public void infoPackage() throws Exception { 
     fh = new FileHandler("test.log", true); 
     // do some test stuff 
     writeEntryToLogFile("entry one"); 
     // do some more test stuff 
     writeEntryToLogFile("entry two"); 
     // do even more test stuff 
     writeEntryToLogFile("entry three"); 
    } 

    private void writeEntryToLogFile(String message) throws Exception { 
     fh.setFormatter(formatter); 
     logger.addHandler(fh); 
     logger.info(message); 
    } 

} 

我的日誌文件結束這樣的:

entry one 
entry two 
entry two 
entry three 
entry three 
entry three 

我想我的東西搞亂了文件處理程序,但我不知道是什麼。

回答

4

您每次調用writeEntryToLogFile()時都會添加一個處理程序。
因此,您在每次調用時都有額外的重複輸出。

您應該添加一個設置方法,爲每個已執行的測試設置上下文。您正在使用
的JUnit允許它與@Before註釋:

@Before 
public void setup() { 
    fh = new FileHandler("test.log", true); 
    formatter = new SimpleFormatter(); 
    fh.setFormatter(formatter); 
    logger.addHandler(fh); 
} 

而作爲一個側面說明,斷言沒有什麼不會使真正意義上的測試方法。

+0

作爲進一步的補充說明,即打印文本的負載,可惱人的,也將你的測試減慢測試方法。 – Michael

+0

這是一個硒測試。它做的東西,但我從代碼中刪除它,因爲它與我面臨的問題無關。這不是很多的文本,但我想有一些隨機生成的值記錄。無論如何,你的解決方案看起來不錯,但它會拋出一個空指針。我想這是因爲文件處理程序稍後在@test中聲明? – tom

+0

@tom你是正確的削減它。它使問題更加明顯。現在爲了指示切割代碼,添加'...'更好。否則,你是對的。'fh = new FileHandler(「test.log」,true);'應該在setup()方法中執行。我更新是正確的。 – davidxxx

3

嘗試移動下面的語句裏面infoPackage()方法

fh.setFormatter(formatter); logger.addHandler(fh);

由於這些越來越設置,因爲方法調用多次。

2

您每次添加消息時都添加相同的處理程序。你應該只做一次。我建議一個靜態的初始化程序。

我註釋掉線,你不再需要的:

public class MyExampleTest { 
    //private FileHandler fh = null; 
    private static final Logger logger; 
    //SimpleFormatter formatter = new SimpleFormatter(); 

    static { 
     logger = Logger.getLogger(MyExampleTest.class.getName()); 
     FileHandler fh = new FileHandler("test.log", true); 
     fh.setFormatter(new SimpleFormatter()); 
     logger.addHandler(fh); 
    } 

    @Test 
    public void infoPackage() throws Exception { 
     //fh = new FileHandler("test.log", true); 
     // do some test stuff 
     writeEntryToLogFile("entry one"); 
     // do some more test stuff 
     writeEntryToLogFile("entry two"); 
     // do even more test stuff 
     writeEntryToLogFile("entry three"); 
    } 

    private void writeEntryToLogFile(String message) throws Exception { 
     //fh.setFormatter(formatter); 
     //logger.addHandler(fh); 
     logger.info(message); 
    } 
} 

值得一提的是,writeEntryToLogFile現在是有點毫無意義,因爲它只是一個單行。我會擺脫這個功能。

1

只是爲了詳細說明Krishna Kuntala說過什麼,當你看Logger類時,添加處理程序正在添加ArrayList

private final CopyOnWriteArrayList <Handler> handlers 

由於您呼叫的附加處理程序時,你在進入三第三次,它會記錄使用三個處理其輸出到同一個文件相同的語句。

2

問題是因爲您多次撥打writeEntryToLogFile()並多次設置fileHandler

移動2行中的調用方法爲:

@Test 
public void infoPackage() throws Exception { 
    fh = new FileHandler("test.log", true); 
    fh.setFormatter(formatter); 
    logger.addHandler(fh); 
    // do some test stuff 
    writeEntryToLogFile("entry one"); 
    // do some more test stuff 
    writeEntryToLogFile("entry two"); 
    // do even more test stuff 
    writeEntryToLogFile("entry three"); 
} 

private void writeEntryToLogFile(String message) throws Exception { 
    logger.info(message); 
} 
相關問題