+++ /dev/null
-package com.ozacc.mail.mock;\r
-\r
-import java.io.UnsupportedEncodingException;\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-import java.util.Properties;\r
-\r
-import javax.mail.MessagingException;\r
-import javax.mail.Session;\r
-import javax.mail.internet.InternetAddress;\r
-import javax.mail.internet.MimeMessage;\r
-\r
-import com.ozacc.mail.Mail;\r
-import com.ozacc.mail.MailBuildException;\r
-import com.ozacc.mail.MailException;\r
-import com.ozacc.mail.SendMail;\r
-import com.ozacc.mail.impl.MimeMessageBuilder;\r
-\r
-/**\r
- * SendMailImplクラスのMock。<br>\r
- * 実存するSMTPサーバを設定しても、実際には送信されません。\r
- * デバッグモードを有効にすると、メールを送信するタイミングでコンソールに送信メール内容が出力されます。\r
- * <p>\r
- * Mailインスタンスを addExpectedMail() にセットし verify() メソッドを実行すると、send() されたMailインスタンスと全てのプロパティ(XHeader、添付ファイルを除く)が一致しなければAssertionFailedExceptionがスローされます。\r
- * <p>\r
- * 例えば、send() されたMailインスタンスのFromアドレスと件名だけチェックし、その他のプロパティはチェックしたくない場合は、MockMailインスタンスを使用します。\r
- * <pre>Mail sentMail = new Mail();\r
- *sentMail.setFrom("from@example.com");\r
- *sentMail.setSubject("件名");\r
- *sentMail.addTo("to@example.com");\r
- *sentMail.setText("動的生成される本文");\r
- *\r
- *Mail expectedMail = new Mail();\r
- *expectedMail.setFrom("from@example.com");\r
- *expectedMail.setSubject("件名");\r
- *\r
- *MockMail mockMail = new MockMail();\r
- *mockMail.setFrom("from@example.com");\r
- *mockMail.setSubject("件名");\r
- *\r
- *MockSendMail sendMail = new MockSendMail();\r
- *sendMail.addExpectedMail(expectedMail);\r
- *sendMail.send(sentMail);\r
- *sendMail.verify(); // 失敗 AssertionFailedException\r
- *\r
- *sendMail = new MockSendMail();\r
- *sendMail.addExpectedMail(mockMail);\r
- *sendMail.send(sentMail);\r
- *sendMail.verify(); // 成功</pre>\r
- * <p>\r
- * <strong>注:</strong> 添付ファイルは比較対象になりません。\r
- * \r
- * @since 1.0\r
- * @author Tomohiro Otsuka\r
- * @version $Id: MockSendMail.java,v 1.10.2.1 2004/11/25 08:01:47 otsuka Exp $\r
- */\r
-public class MockSendMail implements SendMail {\r
-\r
- /** デフォルトのプロトコル。「smtp」 */\r
- public static final String DEFAULT_PROTOCOL = "smtp";\r
-\r
- /** デフォルトのポート。「-1」 */\r
- public static final int DEFAULT_PORT = -1;\r
-\r
- /** デフォルトのSMTPサーバ。「localhost」 */\r
- public static final String DEFAULT_HOST = "localhost";\r
-\r
- /** ISO-2022-JP */\r
- public static final String JIS_CHARSET = "ISO-2022-JP";\r
-\r
- private static final String RETURN_PATH_KEY = "mail.smtp.from";\r
-\r
- private String protocol = DEFAULT_PROTOCOL;\r
-\r
- private String host = DEFAULT_HOST;\r
-\r
- private int port = DEFAULT_PORT;\r
-\r
- private String username;\r
-\r
- private String password;\r
-\r
- private String charset = JIS_CHARSET;\r
-\r
- private String returnPath;\r
-\r
- private List sentMails;\r
-\r
- private List mimeMessages;\r
-\r
- private List expectedMails;\r
-\r
- private boolean debug;\r
-\r
- /**\r
- * コンストラクタ。\r
- */\r
- public MockSendMail() {\r
- super();\r
- initialize();\r
- }\r
-\r
- /**\r
- * MockSendMailインスタンスを初期化します。\r
- */\r
- public void initialize() {\r
- sentMails = new ArrayList();\r
- expectedMails = new ArrayList();\r
- mimeMessages = new ArrayList();\r
- }\r
-\r
- /**\r
- * 送信されたメールのMimeMessageインスタンスを返します。\r
- * 送信順の配列です。\r
- * \r
- * @return 送信メールのMimeMessageインスタンス配列\r
- */\r
- public MimeMessage[] getMimeMessages() {\r
- return (MimeMessage[])mimeMessages.toArray(new MimeMessage[mimeMessages.size()]);\r
- }\r
-\r
- /**\r
- * 送信されたMailインスタンスを返します。送信順の配列です。\r
- * \r
- * @return 送信メールのMailインスタンス配列\r
- */\r
- public Mail[] getSentMails() {\r
- return (Mail[])sentMails.toArray(new Mail[sentMails.size()]);\r
- }\r
-\r
- /**\r
- * デバッグモードが有効になっているか判定します。\r
- * \r
- * @return Returns 有効になっている場合 true\r
- */\r
- public boolean isDebug() {\r
- return debug;\r
- }\r
-\r
- /**\r
- * デバッグモード(コンソールにログを出力)を有効にします。\r
- * デフォルトは無効です。\r
- * \r
- * @param debug デバッグモードを有効にする場合 true\r
- */\r
- public void setDebug(boolean debug) {\r
- this.debug = debug;\r
- }\r
-\r
- /**\r
- * デバッグモードが有効のとき、指定されたメッセージをコンソールに出力します。\r
- * \r
- * @param message コンソール出力するメッセージ\r
- */\r
- private void debug(String message) {\r
- if (debug) {\r
- System.out.println("[" + Thread.currentThread().getName() + "] DEBUG "\r
- + getClass().getName() + " - " + message);\r
- }\r
- }\r
-\r
- /**\r
- * \r
- * @param expectedMail\r
- */\r
- public void addExpectedMail(Mail expectedMail) {\r
- expectedMails.add(expectedMail);\r
- }\r
-\r
- /**\r
- * \r
- * @param expectedMails\r
- */\r
- public void addExpectedMail(Mail[] expectedMails) {\r
- for (int i = 0; i < expectedMails.length; i++) {\r
- addExpectedMail(expectedMails[i]);\r
- }\r
- }\r
-\r
- /**\r
- * \r
- * @throws AssertionFailedException\r
- */\r
- public void verify() throws AssertionFailedException {\r
- debug("======================================================");\r
- debug(" verify() ");\r
- debug("======================================================");\r
-\r
- // メールの数を比較\r
- int numOfExpectedMails = expectedMails.size();\r
- int numOfSentMails = sentMails.size();\r
- if (numOfExpectedMails != numOfSentMails) {\r
- throw new AssertionFailedException("期待メール数<" + numOfExpectedMails + ">と送信メール数<"\r
- + numOfSentMails + ">が一致しませんでした。");\r
- }\r
-\r
- debug("期待メール数と送信メール数は一致しました。[" + numOfExpectedMails + "通]");\r
-\r
- // メール内容を比較\r
- for (int i = 0; i < numOfExpectedMails; i++) {\r
- Mail expected = (Mail)expectedMails.get(i);\r
- Mail sent = (Mail)sentMails.get(i);\r
- debug((i + 1) + "通目のチェックを開始します。("\r
- + ((expected instanceof MockMail) ? "MockMail" : "Mail") + " - Mail)");\r
- checkEquality(expected, sent, i + 1);\r
- debug((i + 1) + "通目の期待メールと送信メール内容は一致しました。");\r
- }\r
-\r
- debug("verifyプロセスは全て成功しました。");\r
- debug("======================================================");\r
- }\r
-\r
- /**\r
- * @param expected\r
- * @param sent \r
- * @throws AssertionFailedException\r
- */\r
- public void checkEquality(Mail expected, Mail sent, int num) throws AssertionFailedException {\r
- boolean mockMode = (expected instanceof MockMail);\r
-\r
- // マルチパートメールの場合\r
- if (expected.isMultipartMail()) {\r
-\r
- // HTML\r
- if (!mockMode) {\r
- if ((expected.getHtmlText() == null && sent.getHtmlText() != null)\r
- || (expected.getHtmlText() != null && sent.getHtmlText() == null)\r
- || (!expected.getHtmlText().equals(sent.getHtmlText()))) {\r
- throwExceptioWithMessage("HTML本文", expected.getHtmlText(), sent.getHtmlText(),\r
- num);\r
- }\r
- } else if (mockMode && expected.getHtmlText() != null) {\r
- if (!expected.getHtmlText().equals(sent.getHtmlText())) {\r
- throwExceptioWithMessage("HTML本文", expected.getHtmlText(), sent.getHtmlText(),\r
- num);\r
- }\r
- }\r
- }\r
-\r
- // Return-Path\r
- if (!mockMode || (mockMode && expected.getReturnPath() != null)) {\r
- if (expected.getReturnPath() != null && sent.getReturnPath() != null) {\r
- if (!expected.getReturnPath().equals(sent.getReturnPath())) {\r
- throwExceptioWithMessage("Return-Pathアドレス", expected.getReturnPath()\r
- .toUnicodeString(), sent.getReturnPath().toUnicodeString(), num);\r
- }\r
- } else if ((expected.getReturnPath() != null && sent.getReturnPath() == null)\r
- || (expected.getReturnPath() == null && sent.getReturnPath() != null)) {\r
- throw new AssertionFailedException();\r
- }\r
- }\r
-\r
- // From\r
- if (!mockMode || (mockMode && expected.getFrom() != null)) {\r
- if (expected.getFrom() != null && sent.getFrom() != null) {\r
- if (!EqualityCheck.equals(expected.getFrom(), sent.getFrom())) {\r
- throwExceptioWithMessage("Fromアドレス", expected.getFrom().toUnicodeString(), sent\r
- .getFrom().toUnicodeString(), num);\r
- }\r
- } else if ((expected.getFrom() != null && sent.getFrom() == null)\r
- || (expected.getFrom() == null && sent.getFrom() != null)) {\r
- throw new AssertionFailedException();\r
- }\r
- }\r
-\r
- // to\r
- InternetAddress[] expectedAddresses = expected.getTo();\r
- InternetAddress[] sentAddresses = sent.getTo();\r
- if (!mockMode || (mockMode && expectedAddresses.length > 0)) {\r
- if (expectedAddresses.length != sentAddresses.length) {\r
- throwExceptioWithMessage("Toアドレス数", Integer.toString(expectedAddresses.length),\r
- Integer.toString(sentAddresses.length), num);\r
- }\r
- for (int i = 0; i < expectedAddresses.length; i++) {\r
- if (!EqualityCheck.equals(expectedAddresses[i], sentAddresses[i])) {\r
- throwExceptioWithMessage("Toアドレス", expectedAddresses[i].toUnicodeString(),\r
- sentAddresses[i].toUnicodeString(), num);\r
- }\r
- }\r
- }\r
-\r
- // cc\r
- expectedAddresses = expected.getCc();\r
- sentAddresses = sent.getCc();\r
- if (!mockMode || (mockMode && expectedAddresses.length > 0)) {\r
- if (expectedAddresses.length != sentAddresses.length) {\r
- throwExceptioWithMessage("Ccアドレス数", Integer.toString(expectedAddresses.length),\r
- Integer.toString(sentAddresses.length), num);\r
- }\r
- for (int i = 0; i < expectedAddresses.length; i++) {\r
- if (!EqualityCheck.equals(expectedAddresses[i], sentAddresses[i])) {\r
- throwExceptioWithMessage("Ccアドレス", expectedAddresses[i].toUnicodeString(),\r
- sentAddresses[i].toUnicodeString(), num);\r
- }\r
- }\r
- }\r
-\r
- // bcc\r
- expectedAddresses = expected.getBcc();\r
- sentAddresses = sent.getBcc();\r
- if (!mockMode || (mockMode && expectedAddresses.length > 0)) {\r
- if (expectedAddresses.length != sentAddresses.length) {\r
- throwExceptioWithMessage("Bccアドレス数", Integer.toString(expectedAddresses.length),\r
- Integer.toString(sentAddresses.length), num);\r
- }\r
- for (int i = 0; i < expectedAddresses.length; i++) {\r
- if (!EqualityCheck.equals(expectedAddresses[i], sentAddresses[i])) {\r
- throwExceptioWithMessage("Bccアドレス", expectedAddresses[i].toUnicodeString(),\r
- sentAddresses[i].toUnicodeString(), num);\r
- }\r
- }\r
- }\r
-\r
- // Reply-To\r
- if (!mockMode || (mockMode && expected.getReplyTo() != null)) {\r
- if (expected.getReplyTo() != null && sent.getReplyTo() != null) {\r
- if (!EqualityCheck.equals(expected.getReplyTo(), sent.getReplyTo())) {\r
- throwExceptioWithMessage("ReplyToアドレス",\r
- expected.getReplyTo().toUnicodeString(), sent.getReplyTo()\r
- .toUnicodeString(), num);\r
- }\r
- } else if ((expected.getReplyTo() != null && sent.getReplyTo() == null)\r
- || (expected.getReplyTo() == null && sent.getReplyTo() != null)) {\r
- throw new AssertionFailedException();\r
- }\r
- }\r
-\r
- // 件名\r
- if (!mockMode || (mockMode && expected.getSubject().length() > 0)) {\r
- if (!expected.getSubject().equals(sent.getSubject())) {\r
- throwExceptioWithMessage("件名", expected.getSubject(), sent.getSubject(), num);\r
- }\r
- }\r
-\r
- // 本文\r
- if (!mockMode || (mockMode && expected.getText().length() > 0)) {\r
- if (!expected.getText().equals(sent.getText())) {\r
- throwExceptioWithMessage("本文", expected.getText(), sent.getText(), num);\r
- }\r
- }\r
-\r
- }\r
-\r
- /**\r
- * 引数の値を受けてエラーメッセージを生成し、AssertionFailedErrorをスローします。\r
- * \r
- * @param name 一致しなかった項目名\r
- * @param expectedValue 期待値\r
- * @param sentValue 実際値\r
- * @param num N番目のメール\r
- * @throws AssertionFailedException 生成された例外\r
- */\r
- protected void throwExceptioWithMessage(String name, String expectedValue, String sentValue,\r
- int num) throws AssertionFailedException {\r
- String message = num + "番目のメッセージで、「" + name + "」が一致しませんでした。期待値='" + expectedValue\r
- + "', 送信値='" + sentValue + "'";\r
-\r
- debug(message);\r
- debug("verifyプロセスは失敗しました。");\r
- debug("******************************************************");\r
-\r
- throw new AssertionFailedException(message);\r
- }\r
-\r
- /**\r
- * @see com.ozacc.mail.SendMail#send(com.ozacc.mail.Mail)\r
- */\r
- public void send(Mail mail) throws MailException {\r
- send(new Mail[] { mail });\r
- }\r
-\r
- /**\r
- * @see com.ozacc.mail.SendMail#send(com.ozacc.mail.Mail[])\r
- */\r
- public void send(Mail[] mails) throws MailException {\r
- debug("SMTPサーバ[" + host + "]に接続するフリ。");\r
- debug("SMTPサーバ[" + host + "]に接続したフリ。");\r
-\r
- Session session = Session.getInstance(new Properties());\r
- for (int i = 0; i < mails.length; i++) {\r
-\r
- Mail mail = mails[i];\r
-\r
- // MimeMessageを生成\r
- MimeMessage message = new MimeMessage(session);\r
- MimeMessageBuilder builder = new MimeMessageBuilder(message);\r
- try {\r
- builder.buildMimeMessage(mail);\r
- } catch (UnsupportedEncodingException e) {\r
- throw new MailBuildException("サポートされていない文字コードが指定されました。", e);\r
- } catch (MessagingException e) {\r
- throw new MailBuildException("MimeMessageの生成に失敗しました。", e);\r
- }\r
- mimeMessages.add(message);\r
-\r
- debug("メールを送信するフリ。");\r
- sentMails.add(mail);\r
- debug(mail.toString());\r
- debug("メールを送信したフリ。");\r
- }\r
-\r
- debug("SMTPサーバ[" + host + "]との接続を切断するフリ。");\r
- debug("SMTPサーバ[" + host + "]との接続を切断したフリ。");\r
- }\r
-\r
- /**\r
- * @see com.ozacc.mail.SendMail#send(javax.mail.internet.MimeMessage)\r
- */\r
- public void send(MimeMessage mimeMessage) throws MailException {\r
- throw new UnsupportedOperationException("申し訳ございません。MockSendMailでは、このメソッドをサポートしていません。");\r
- }\r
-\r
- /**\r
- * @see com.ozacc.mail.SendMail#send(javax.mail.internet.MimeMessage[])\r
- */\r
- public void send(MimeMessage[] mimeMessages) throws MailException {\r
- throw new UnsupportedOperationException("申し訳ございません。MockSendMailでは、このメソッドをサポートしていません。");\r
- }\r
-\r
- /**\r
- * エンコーディングに使用する文字コードを返します。\r
- * \r
- * @return エンコーディングに使用する文字コード\r
- */\r
- public String getCharset() {\r
- return charset;\r
- }\r
-\r
- /**\r
- * メールの件名や本文のエンコーディングに使用する文字コードを指定します。\r
- * デフォルトは ISO-2022-JP です。\r
- * \r
- * @param charset エンコーディングに使用する文字コード\r
- */\r
- public void setCharset(String charset) {\r
- this.charset = charset;\r
- }\r
-\r
- /**\r
- * セットされたSMTPサーバのホスト名、またはIPアドレスを返します。\r
- * \r
- * @return SMTPサーバのホスト名、またはIPアドレス\r
- */\r
- public String getHost() {\r
- return host;\r
- }\r
-\r
- /**\r
- * SMTPサーバのホスト名、またはIPアドレスをセットします。\r
- * デフォルトは localhost です。\r
- * \r
- * @param host SMTPサーバのホスト名、またはIPアドレス\r
- */\r
- public void setHost(String host) {\r
- this.host = host;\r
- }\r
-\r
- /**\r
- * @return SMTPサーバ認証パスワード\r
- */\r
- public String getPassword() {\r
- return password;\r
- }\r
-\r
- /**\r
- * SMTPサーバの接続認証が必要な場合にパスワードをセットします。\r
- * \r
- * @param password SMTPサーバ認証パスワード\r
- */\r
- public void setPassword(String password) {\r
- this.password = password;\r
- }\r
-\r
- /**\r
- * @return SMTPサーバのポート番号\r
- */\r
- public int getPort() {\r
- return port;\r
- }\r
-\r
- /**\r
- * SMTPサーバのポート番号をセットします。\r
- * \r
- * @param port SMTPサーバのポート番号\r
- */\r
- public void setPort(int port) {\r
- this.port = port;\r
- }\r
-\r
- /**\r
- * @return Returns the protocol.\r
- */\r
- public String getProtocol() {\r
- return protocol;\r
- }\r
-\r
- /**\r
- * @param protocol The protocol to set.\r
- */\r
- public void setProtocol(String protocol) {\r
- this.protocol = protocol;\r
- }\r
-\r
- /**\r
- * @return Return-Pathアドレス\r
- */\r
- public String getReturnPath() {\r
- return returnPath;\r
- }\r
-\r
- /**\r
- * Return-Pathアドレスをセットします。\r
- * \r
- * @param returnPath Return-Pathアドレス\r
- */\r
- public void setReturnPath(String returnPath) {\r
- this.returnPath = returnPath;\r
- }\r
-\r
- /**\r
- * @return SMTPサーバ認証ユーザ名\r
- */\r
- public String getUsername() {\r
- return username;\r
- }\r
-\r
- /**\r
- * SMTPサーバの接続認証が必要な場合にユーザ名をセットします。\r
- * \r
- * @param username SMTPサーバ認証ユーザ名\r
- */\r
- public void setUsername(String username) {\r
- this.username = username;\r
- }\r
-\r
-}
\ No newline at end of file