2016-09-06 17 views
0

我在Future.respond中運行了一些代碼,由於一個錯誤,它會拋出一個NPE。問題是我的單元測試完全錯過了它,並且都非常高興地通過,因爲NPE被RootMonitor吞噬了。覆蓋RootMonitor

所以,我的問題是,如果有任何方式來覆蓋單元測試的RootMonitor行爲導致測試失敗而不是吞嚥異常?

我知道,我可以在響應中捕獲異常,但這有點不好 - 如果我認爲可能會有異常,我會首先解決它。這正是我希望我的測試能夠抓住的一種情況。

所以,我正在尋找的是一種方法來覆蓋測試的全局RootMonitor,或者以某種方式聲明它在測試結束後不會處理異常。 有沒有辦法做這樣的事情?人們通常如何處理這種測試?

回答

1

好吧,我想我找到了一個解決方案。這看起來有點笨拙,所以如果有人能想出一個更好的方法,請插入,但這裏。

class MonitoredSuite extends FunSuite { 
    protected override def withFixture(test: NoArgTest): Outcome = { 
     var exception: Throwable = null 
     Monitor.using(Monitor.mk { 
     case e => 
     exception = e 
     false 
     })(test()) match { 
     case [email protected](_) => x 
     case s if exception == null => s 
     case _ => Exceptional(exception) 
     } 
    }   
    } 

基本上,我每個測試之前安裝一個空操作監視器,然後產生一個失敗,如果它被調用。