差異處

這裏顯示兩個版本的差異處。

連向這個比對檢視

Both sides previous revision 前次修改
下次修改
前次修改
java:junit:powermockito:mockpartial [2014/12/10 16:54]
tony
java:junit:powermockito:mockpartial [2023/06/25 09:48] (目前版本)
行 20: 行 20:
  PowerMockito.spy(System.class);​  PowerMockito.spy(System.class);​
  PowerMockito.doReturn("​test"​).when( System.class,​ "​getProperty",​ "​test"​);​  PowerMockito.doReturn("​test"​).when( System.class,​ "​getProperty",​ "​test"​);​
- + 
 + // 如果是沒任何回傳值的method,可以使用PowerMockito.doNothing() 
  System.out.println(System.getProperty("​test"​));​  System.out.println(System.getProperty("​test"​));​
 </​code>​ </​code>​
-另一種寫法如下:​+這種寫法存在的問題有兩個, 
 +  - 如果要呼叫的method有overloading,且使用Matchers.any當參數,將導致NullPointerException。問題發生原因為PowerMock會將Matchers.any產生的類別型態,識別為null,在判斷呼叫參數時就發生問題。 
 +  - 如果method名稱有修改,將不容易查覺。 
 +因此第二種寫法如下:​
 <code java> <code java>
  PowerMockito.spy(System.class);​  PowerMockito.spy(System.class);​
行 33: 行 38:
  PowerMock.verifyAll();​  PowerMock.verifyAll();​
 </​code>​ </​code>​
 +第二種方法的缺點是無法mock private method。第三種做法是透過WhiteboxImpl去取得method instance,再透過when去呼叫,可以參考此[[http://​stackoverflow.com/​questions/​17695356/​powermockito-cant-seem-to-match-and-overloaded-method|link]]。\\
 +
 +這三種做法,我還沒找到一個較好final solution。不管用哪一種,都可能會有side-effect。如第三種做法去mock System.getProperty就發生與[[http://​stackoverflow.com/​questions/​15901580/​mockito-what-to-do-when-anystring-is-not-ok|link]]相同問題。
  
-如果是沒任何回傳值的method,可以使用PowerMockito.doNothing()。 
-\\ 
 \\ \\
 友藏內心獨白:​ 實際應用會遇到更多問題的! 友藏內心獨白:​ 實際應用會遇到更多問題的!