UnsupportedOperationException: Unsupported copy option

於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);

這問題是由於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,因此是不會相同的。