我有一個Java應用程序,它使用具有附件的電子郵件。偶爾我看到這樣的錯誤:我可以強制在MimeMessage中發生UnsupportedEncodingException嗎?
java.io.UnsupportedEncodingException: X-iso88591
at sun.nio.cs.StreamDecoder.forInputStreamReader(StreamDecoder.java:71) ~[na:1.7.0_65]
at java.io.InputStreamReader.<init>(InputStreamReader.java:100) ~[na:1.7.0_65]
at com.sun.mail.handlers.text_plain.getContent(text_plain.java:107) ~[mail-1.4.5.jar:na]
at javax.activation.DataSourceDataContentHandler.getContent(DataHandler.java:795) ~[na:1.7.0_65]
at javax.activation.DataHandler.getContent(DataHandler.java:542) ~[na:1.7.0_65]
at javax.mail.internet.MimeMessage.getContent(MimeMessage.java:1420) ~[mail-1.4.5.jar:na]
我想寫一個單元測試重現此行爲。但是我遇到了一個問題,我無法對某些「不好」的內容進行編碼,以便我可以嘗試(並且失敗)以後解碼它。
我甚至寫了一個「假」字符集(稱爲BorkBorkBork
) - 但似乎只習慣進行編碼,但不解碼
MimeMessage message = new MimeMessage(Session.getDefaultInstance(new Properties()));
Multipart container = new MimeMultipart();
MimeBodyPart bodyPart = new MimeBodyPart();
bodyPart.setDescription("日本語 Nihongo", "BorkBorkBork");
bodyPart.setText("日本語 Nihongo", "BorkBorkBork");
container.addBodyPart(bodyPart);
message.setContent(container);
message.getContent(); // I want this to fail
這是我寫的Charset
public class BorkBorkBorkCharset extends Charset {
public BorkBorkBorkCharset() {
super("BorkBorkBork", new String[]{});
}
@Override
public boolean contains(Charset cs) {
throw new UnsupportedOperationException();
}
public CharsetDecoder newDecoder() {
throw new UnsupportedOperationException();
}
public CharsetEncoder newEncoder() {
return new CharsetEncoder(Charset.forName("UTF8"), 10, 10) {
@Override
protected CoderResult encodeLoop(CharBuffer charBuffer, ByteBuffer byteBuffer) {
return CoderResult.UNDERFLOW;
}
};
}
}
我也寫了CharsetProvider
public class BorkBorkBorkCharsetProvider extends CharsetProvider {
@Override
public Iterator<Charset> charsets() {
throw new UnsupportedOperationException();
}
@Override
public Charset charsetForName(String charsetName) {
if (StringUtils.equals("BorkBorkBork", charsetName)) {
return new BorkBorkBorkCharset();
}
return null;
}
}
我不確定我是否正在走這條正確的道路。可能嗎?我可以採取另一種方法嗎?
正如你正在尋找測試這種行爲......你有沒有考慮過使用像Mockito或類似的模擬框架?你可以專門指示你的模擬器在這一行中拋出異常 - 甚至不知道它在現實生活中如何發生。 – Jan
這正是我所做的 - 我在發表評論的同時發佈了一個答案。謝謝 –