2017-03-09 41 views
1

下課後說我有一個Map<String, Action>,我是這樣的:AssertJ - 繼續用流利的斷言檢查

assertThat(spyActionMap.get("a")).isInstanceOf(Action.class); 

...通行證。現在,我要檢查所獲得的Action是正確的:

assertThat(spyActionMap.get("a")).isInstanceOf(Action.class).getValue(Action.NAME).isEqualTo("Go crazy"); 

...不能編譯,這並不奇怪。有沒有辦法做這種事情?

+0

請提供一些更多的上下文類似'Action'類或至少它的相關部分。它有一個'getValue'方法嗎?什麼是「Action.NAME」? 你在做什麼專門試驗? – Riggs

+0

你只需要查找Javadoc來回答第一和第二個問題。你的第三個問題的答案是,我害怕:如果你需要問... –

+0

告訴我看看Javadoc暗示我,你可能意味着接口'javax.swing.Action',是嗎?我發現它有一個靜態字段'NAME',甚至一個'getValue'方法。如果你首先在你的問題中提供了這個信息(至少有一個標籤),那將會很有幫助。 – Riggs

回答

1

你可以嘗試isInstanceOfSatisfying並在Consumer指定斷言:

Object yoda = new Jedi("Yoda", "Green"); 
Object luke = new Jedi("Luke Skywalker", "Green"); 

Consumer<Jedi> jediRequirements = jedi -> { 
    assertThat(jedi.getLightSaberColor()).isEqualTo("Green"); 
    assertThat(jedi.getName()).doesNotContain("Dark"); 
}; 

assertThat(yoda).isInstanceOfSatisfying(Jedi.class, jediRequirements); 
assertThat(luke).isInstanceOfSatisfying(Jedi.class, jediRequirements); 
+0

謝謝......作爲AssertJ背後的主要人物之一,如果'isInstanceOf'(以及類似的方法)返回的'Assert'接口不能以某種方式將其與檢查的實例「交換」它投向有問題的班級?你給出的解決方案說明了在AssertJ工具箱中使用一個更有用的工具......但它可能不是最理想的「流利」(顯然,我不知道設計我的想法是多麼困難......!) –

+0

由於Java的泛型限制,不幸的是不可能的,這已經在https://github.com/joel-costigliola/assertj-core/issues/683中進行了討論,這導致了「isInstanceOfSatisfying」解決方案。 –