У меня есть приложение 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;
}
}
Я не уверен, что я пойду по правильному пути. Является ли это возможным? Есть ли другой подход, который я могу предпринять?
Как вы хотите проверить это поведение ... считаете ли вы, что используете насмешливую структуру, такую как Mockito или подобное? Вы могли бы специально проинструктировать вашего макета, чтобы он выбрал это исключение в этой строке - даже не зная, как это происходит в реальной жизни. – Jan
Это именно то, что я сделал - я отправил ответ одновременно с вашим комментарием. спасибо –