Problem
於PowerMockRunner環境中,使用Files.copy且搭配ExtendedCopyOption.INTERRUPTIBLE參數時,程式會丟出java.lang.UnsupportedOperationException: Unsupported copy option例外:
Files.copy(new File("./test1.txt").toPath(), new File("./test2.txt").toPath(), ExtendedCopyOption.INTERRUPTIBLE, StandardCopyOption.REPLACE_EXISTING);
How to?
這問題是由於ExtendedCopyOption.INTERRUPTIBLE所造成的,我直接在@PowerMockIgnore中加入對應的套件,就順利解決這問題。
@PowerMockIgnore({"java.nio.*","sun.nio.*", "java.util.ServiceLoader", "com.sun.nio.*"})
後來查詢JDK原始碼,在JDK中的WindowsFileCopy或UnixFileCopy會做參數比較:
70 if (option == ExtendedCopyOption.INTERRUPTIBLE) { 71 interruptible = true; 72 continue; 73 }
然而在PowerMock環境中,卻無法如預期判別;於是我直接印出ExtendedCopyOption的classLoader:
System.out.println(ExtendedCopyOption.class.getClassLoader());
最後發現在PowerMock環境中為MockClassLoader,而非PowerMock環境則為null(null代表bootstrap class loader);在測試中所傳入的ExtendedCopyOption為MockClassLoader,而比較時WindowsFileCopy或UnixFileCopy的ExtendedCopyOption來自於Bootstrap,因此是不會相同的。
留言
張貼留言