代码之家  ›  专栏  ›  技术社区  ›  Hamza Yerlikaya

测试Javamail相关模块

  •  2
  • Hamza Yerlikaya  · 技术社区  · 14 年前

    我的应用程序的一部分依赖于javamail、移动排列消息等。是否可以在不触发IMAP服务器的情况下测试此模块来运行测试?在测试依赖于外部服务器或模块的东西时,我总是陷入困境。

    3 回复  |  直到 14 年前
        1
  •  1
  •   Arne Deutsch    14 年前

    如果应用程序发送电子邮件,那么没有IMAP服务器就无法进行测试。但是,如果您正确地设计代码,您可以做的其他事情。你应该做的是分开你的依赖。这是什么意思?

    您的代码应该只在一个地方访问第三方代码(本例中是javamail)(大多数情况下==只有一个类)。用接口将这个类与其他代码分开,这样您就可以在测试中使用一个虚拟对象。

    下面是一个您不应该做的示例(假设javamail是外部依赖项):

    class Application {
        public run(String[] receiverList, String message, String body) {
            for (String receiver : receiverList) {
               JavaMail.sendMessage(receiver, message, body);
            }
        }
    }
    

    在这种情况下,不能测试for循环。改为这样做:

    class Application {
        private IApplicatioNMail mail;
    
        public Application(IApplicationMail mail) {
            this.mail = mail;
        }
    
        public run(String[] receiverList, String message, String body) {
            for (String receiver : receiverList) {
               mail.sendMessage(receiver, message, body);
            }
        }
    }
    
    class JavaApplicationMail implement IApplicationMail {
        public sendMessage(String receiver, String message, String body) {
            JavaMail.sendMessage(receiver, message, body);
        }
    }
    

    通过这种方式,您可以在测试中创建一个虚拟(模拟,无论什么)来替换javaapplicationmail。在您的测试中,从未调用外部资源)。

    测试可能看起来像这样:

    @Test
    public void sentThreeMails() throws Exception {
        IApplicationMail mailCounter = new MailCounter();
        Application application = new Application(mailCounter);
        application.run(new String[] { "one", "two", "three" }, "Hello", "Blah!");
    
        assertEquals(3, mailCounter.calls);
    }
    
    class MailCounter implements IApplicationMail {
        public counter = 0;
    
        public sendMessage(String receiver, String message, String body) {
            counter++;
        }
    }
    
        2
  •  2
  •   Chuk Lee    14 年前

    试着用这个 mock 为了你的测试

        3
  •  1
  •   Martin    14 年前

    为测试套件启动一个IMAP服务器可能是一个好主意。 GreenMail 是为这个目的而设计的,它允许您从Java代码中运行内存IMAP/POP3/SMTP服务器。