Loading .eml files into javax.mail.Messages

后端 未结 2 437
眼角桃花
眼角桃花 2021-01-12 11:35

I\'m trying to unit test a method which processes javax.mail.Message instances.

I am writing a converter to change emails which arrive in different form

相关标签:
2条回答
  • 2021-01-12 11:49

    After a few tests, I finally successfully loaded a message using the MimeMessage(Session, InputStream) public constructor (as opposed to the Folder-based protected one cited in the other response).

    import java.io.FileInputStream;
    import java.io.InputStream;
    
    import javax.mail.internet.MimeMessage;
    
    public class LoadEML {
    
        public static void main(String[] args) throws Exception {
            InputStream is = new FileInputStream(args[0]);
            MimeMessage mime = new MimeMessage(null, is);
            System.out.println("Subject: " + mime.getSubject());
        }
    
    }
    
    0 讨论(0)
  • 2021-01-12 11:54

    My problem came from using Mockito to mock the javax.mail.Folder required by javax.mail.internet.MimeMessage's constructor MimeMessage(Folder, InputStream, int). This calls the constructor for javax.mail.Message Message(Folder, int) which then accesses folder.store.session. This resulted in a NullPointerException being thrown by the constructor for MimeMessage.

    Solution:

    class ClasspathMimeMessage extends MimeMessage {
        private ClasspathMimeMessage(Folder folder, InputStream is, int msgnum) throws MessagingException {
            super(folder, is, 0);
        }
    
        public static MimeMessage create(String resourceName) {
            Class<PopEmailMmsReceiverTest> loaderClass = PopEmailMmsReceiverTest.class;
            InputStream is = loaderClass.getResourceAsStream(resourceName);
    
            Folder inbox = new MyFolder();
    
            try {
                return new ClasspathMimeMessage(inbox, is, 0);
            } catch (MessagingException ex) {
                throw new RuntimeException("Unable to load email from classpath at " + loaderClass.getResource(resourceName).toString());
            }
        }
    }
    
    class MyFolder extends Folder {
        MyFolder() {
            super(createMockStore());
        }
        private static Store createMockStore() {
            return mock(Store.class);
        }
        public void appendMessages(Message[] msgs) throws MessagingException {
        }
        public void close(boolean expunge) throws MessagingException {
        }
        public boolean create(int type) throws MessagingException {
            return false;
        }
        public boolean delete(boolean recurse) throws MessagingException {
            return false;
        }
        public boolean exists() throws MessagingException {
            return false;
        }
        public Message[] expunge() throws MessagingException {
            return null;
        }
        public Folder getFolder(String name) throws MessagingException {
            return null;
        }
        public String getFullName() {
            return null;
        }
        public Message getMessage(int msgnum) throws MessagingException {
            return null;
        }
        public int getMessageCount() throws MessagingException {
            return 0;
        }
        public String getName() {
            return null;
        }
        public Folder getParent() throws MessagingException {
            return null;
        }
        public Flags getPermanentFlags() {
            return null;
        }
        public char getSeparator() throws MessagingException {
            return 0;
        }
        public int getType() throws MessagingException {
            return 0;
        }
        public boolean hasNewMessages() throws MessagingException {
            return false;
        }
        public boolean isOpen() {
            return false;
        }
        public Folder[] list(String pattern) throws MessagingException {
            return null;
        }
        public void open(int mode) throws MessagingException {
        }
        public boolean renameTo(Folder f) throws MessagingException {
            return false;
        }   
    }
    

    This looks very ugly to me, so if anyone has a better suggestion, I'd be delighted to hear it.

    0 讨论(0)
提交回复
热议问题