2016-11-21 44 views
0

我已經使用JMockit很長一段時間了,我非常喜歡它。但是,我遇到了一個我似乎無法解決的問題。查看下面的代碼片段,瞭解一些Kotlin測試代碼,測試Kotlin生產代碼。使用JMockit和Kotlin捕獲對象

@Injectable 
lateinit var experimentStorage: ExperimentStorage 
... 
val experimentCaptor = mutableListOf<Experiment>() 
object : Verifications() { 
    init { 
     experimentStorage.save(withCapture(experimentCaptor)) 
    } 
} 

當我運行我的測試,我得到以下錯誤:

java.lang.IllegalStateException: withCapture(experimentCaptor) must not be null

我100%肯定我的生產代碼正確行使存儲,因爲當我更換捕獲像下面,我測試成功:

object : Verifications() { 
    init { 
     experimentStorage.save(withAny(experiment)) 
    } 
} 

有沒有人有使用JMockit(1.28)在Kotlin中捕獲參數的經驗?我究竟做錯了什麼?我想它與init塊有關,因爲在Java中,您將使用靜態空間...

回答

0

最終我無法在Kotlin中找到任何解決此問題的方法。問題在於靜態空間。在Kotlin中,您有init塊,您必須記錄您的Expectations/Verifications,但JMockit實際上預計在靜態空間中(因此爲{{...}}表示法)。

我現在的解決方法是讓綁匪在Java中,所以我在我的Java測試來源Captors類,看起來像這樣

public class Captors { 

    public static List<Experiment> experimentStorage_save(ExperimentStorage experimentStorage) { 
     final List<Experiment> captor = new ArrayList<>(); 
     new Verifications() {{ 
      experimentStorage.save(withCapture(captor)); 
     }}; 
     return captor;  
    } 

    ... 
}