2015-12-03 59 views
0

我有一個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; 
    } 
} 

我不確定我是否正在走這條正確的道路。可能嗎?我可以採取另一種方法嗎?

+1

正如你正在尋找測試這種行爲......你有沒有考慮過使用像Mockito或類似的模擬框架?你可以專門指示你的模擬器在這一行中拋出異常 - 甚至不知道它在現實生活中如何發生。 – Jan

+0

這正是我所做的 - 我在發表評論的同時發佈了一個答案。謝謝 –

回答

1

我通過嘲弄解決了這個問題。我沒有完全重現的場景,但我可以模擬出我的代碼與異常

when(mimeMessage.getContent()).thenThrow(new UnsupportedEncodingException("X-iso88591")); 
0

你不需要做任何特殊的編碼或創建自己的字符集交易的爛路。只需創建一個MimeMessage,使用setText方法設置消息的正文,併爲setText方法指定一個僞造字符集名稱。然後調用MimeMessage.saveChanges並使用getContent方法來回讀消息的正文。你應該得到一個UnsupportedEncodingException。

相關問題