سؤال

أحاول وحدة اختبار طريقة تعمل javax.mail.Message حالات.

أكتب محولًا لتغيير رسائل البريد الإلكتروني التي تصل بتنسيقات مختلفة ثم يتم تحويلها إلى تنسيق داخلي ثابت (MyMessage). يعتمد هذا التحويل عادةً على الإضفاء MyMessage.

لدي مجموعة من رسائل البريد الإلكتروني الخام التي يتم حفظها محليًا .eml الملفات ، وأرغب في إجراء اختبار وحدة يقوم بتحميل .eml الملفات من classpath وتحويلها إلى javax.mail.Message حالات. هل هذا ممكن ، وإذا كان الأمر كذلك ، كيف سيتم القيام به؟

هل كانت مفيدة؟

المحلول 2

جاءت مشكلتي من استخدام Mockito للسخرية javax.mail.Folder مطلوب من قبل javax.mail.internet.MimeMessageمُنشئ MimeMessage(Folder, InputStream, int). هذا يدعو المنشئ ل javax.mail.Message Message(Folder, int) الذي يصل بعد ذلك folder.store.session. أدى هذا إلى أ NullPointerException يجري إلقاؤه من قبل المُنشئ ل MimeMessage.

المحلول:

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;
    }   
}

هذا يبدو قبيحًا جدًا بالنسبة لي ، لذلك إذا كان لدى أي شخص اقتراح أفضل ، سأكون سعيدًا لسماع ذلك.

نصائح أخرى

بعد بضع اختبارات ، نجحت أخيرًا في تحميل رسالة باستخدام ملف MimeMessage(Session, InputStream) مُنشئ عام (على عكس واحد مستند إلى المجلد المحمي في الاستجابة الأخرى).

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());
    }

}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top