2015-12-03 1 views
0

У меня есть приложение Java, которое расходует сообщения электронной почты, которые имеют вложения. Иногда я вижу такие ошибки:Могу ли я заставить UnsupportedEncodingException произойти в MimeMessage?

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] 

Я пытаюсь написать единичный тест, чтобы воспроизвести это поведение. Но у меня проблема, из-за которой я не могу кодировать что-то «плохо», чтобы я мог попытаться (и не смог) декодировать его позже.

Я даже написал «фальшивый» Charset (так называемый 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

У меня проблема вокруг насмешливо. Я не точно воспроизвести сценарий, но я был в состоянии смоделировать плохой способ, что мой код имеет дело с Exception

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

Вам не нужно делать какое-либо специальное кодирование или создать свой собственный Charset. Просто создайте MimeMessage, используйте метод setText, чтобы установить тело сообщения, и укажите имя фиктивного символа для метода setText. Затем вызовите MimeMessage.saveChanges и используйте метод getContent для чтения тела сообщения. Вы должны получить UnsupportedEncodingException.

Смежные вопросы