差異處
這裏顯示兩個版本的差異處。
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()。 | ||
- | \\ | ||
\\ | \\ | ||
友藏內心獨白: 實際應用會遇到更多問題的! | 友藏內心獨白: 實際應用會遇到更多問題的! |