我在为(改善学习日记的登录模式 (0篇) http://www.learndiary.com/disGoalContentAction.do?goalID=1214&naviStr=a10a60)写发送重置密码信件的测试代码时,发现测试过程中,测试代码中另一个发送邮件的线程没有执行,测试程序就结束了。
难道junit不能用于多线程的程序的测试吗?
这是含发送邮件的程序:
// $Id: EmailResetPsdAction.java,v 1.8 2005/12/19 16:00:49 dashing_meng Exp $
// Copyright (c) 2004-2005 Http://www.learndiary.com. All Rights Reserved.
// Permission to use, copy, modify, and distribute this software and its
// documentation without fee, and without a written agreement is hereby
// granted, provided that the above copyright notice and this paragraph
// appear in all copies. This software program and documentation are
// copyrighted by http://www.learndiary.com. The software program and
// documentation are supplied "AS IS", without any accompanying services
// from The LearnDiary. The LearnDiary does not warrant that the operation
// of the program will be uninterrupted or error-free. The end-user
// understands that the program was developed for research purposes and is
// advised not to rely exclusively on the program for any reason.
// IN NO EVENT SHALL HTTP://WWW.LEARNDIARY.COM BE LIABLE TO ANY PARTY FOR
// DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES,
// INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS
// DOCUMENTATION, EVEN IF HTTP://WWW.LEARNDIARY.COM HAS BEEN ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE. HTTP://WWW.LEARNDIARY.COM SPECIFICALLY
// DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
// SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND
// HTTP://WWW.LEARNDIARY.COM HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE,
// SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
package com.learndiary.website.action.account;
import java.sql.Timestamp;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.logging.*;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionMapping;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import com.learndiary.website.actionform.EmailResetPsdForm;
import com.learndiary.website.manager.EmailResetPsdManager;
import com.learndiary.website.manager.EmailSender;
import com.learndiary.website.manager.UserManager;
import com.learndiary.website.model.Email;
import com.learndiary.website.model.EmailResetPsdInfo;
import com.learndiary.website.model.UserInfo;
import com.learndiary.website.util.Util;
/**
* Process user's asking for sending resetting password token email request.
* @author http://www.learndiary.com,LearnDiary Develop Group
*/
public class EmailResetPsdAction extends Action {
/**
* Function:
* Process user's asking for sending resetting password token email request.
* Pseudo Coding:
*
* {
* String userName;
* UserInfo userInfo;
* int userID;
* UserManager userManager;
* EmailResetPsdManager emailResetPsdManager;
* EmailResetPsdInfo emailResetPsdInfo;
* Email email;
*
* userName=((EmailResetPsdForm)form).getUserName();//Get the userName from form
* userInfo= userManager. findByName(userName);//Get userInfo
* if (userInfo==null){
* forward to emailFailure.jsp;
* }
* userID=userInfo.getUserID();
* emailResetPsdInfo=emailResetPsdManager.findByID();// Get emailResetPsdInfo
* if (emailResetPsdInfo!=null){
* foward to emailFailure.jsp;
* }
*
* //set emaiResetPsdInfo
* emaiResetPsdInfo.setUserID(userID);
* emaiResetPsdInfo.setToken(com.learndiary.website.util.Util.genRandomStr());
* emailResetPsdInfo.setSendDate(System.getCurrentTime());
* emailResetPsdManager.insertResetPsdInfo(emailResetPsdInfo);//record emailResetPsdInfo
* //set reset passwrod email's content
* email.setRecipient(userInfo.getEmail());
* email.setSubject("your reset password request.");
* email.setText( "http://localhost:8080/learndiary/resetPsdAction.do?userID=" + userID + "token=" + emaiResetPsdInfo.getToken());
* emailSender.send(email);
* forward to emailSuccess.jsp;
* }
*
*
*
*/
private org.apache.commons.logging.Log __log = LogFactory.getFactory().getInstance(this.getClass());
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {
String myaction = mapping.getPath();
__log.info("Enter action: "+myaction);
String target=null;
String userName=null;
UserInfo userInfo=null;
int userID;
UserManager userManager=new UserManager();
EmailResetPsdManager emailResetPsdManager=new EmailResetPsdManager();
EmailResetPsdInfo emailResetPsdInfo=null;
Email email=null;
EmailSender emailSender=new EmailSender();
userName=((EmailResetPsdForm)form).getUserName();//Get the userName from form
try {
__log.debug("Before findByName,and name is: "+userName);
userInfo= userManager.findByName(userName);//Get userInfo
__log.debug("After findByName,and userInfo is: "+userInfo);
} catch (ClassNotFoundException e1) {
e1.printStackTrace();
}
if (userInfo==null){
target=new String("failure");
return (mapping.findForward(target));//no such a user,forward to emailFailure.jsp;
}
userID=userInfo.getUserID();
__log.debug("userID: "+userID);
try {
emailResetPsdInfo=emailResetPsdManager.findByID(userID);// Get emailResetPsdInfo
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
__log.debug("existed emailResetPsdInfo is: " + emailResetPsdInfo);
if (emailResetPsdInfo!=null){//user requested emailing resetting password token in 72 hours
target=new String("failure");
return (mapping.findForward(target));//foward to emailFailure.jsp;
}
//set emaiResetPsdInfo
emailResetPsdInfo=new EmailResetPsdInfo();
emailResetPsdInfo.setUserID(userID);
emailResetPsdInfo.setToken(Util.genRandomStr());
emailResetPsdInfo.setSendTime(new Timestamp(System.currentTimeMillis()));
__log.debug("new emailResetPsdInfo is: "+emailResetPsdInfo);
try {
emailResetPsdManager.insertResetPsdInfo(emailResetPsdInfo);
__log.debug("insert emailResetPsdInfo ok!");
} catch (Exception e2) {
e2.printStackTrace();
}//record emailResetPsdInfo
//set reset passwrod email's content
email=new Email();
email.setRecipient(userInfo.getEmail());
email.setSubject("Your resetting password request.");
email.setText( "http://localhost:8080/learndiary_login/account/resetPsd.jsp?userID="
+ userID + "&token=" + emailResetPsdInfo.getToken());
__log.debug("email is: " + email);
emailSender.send(email);//这里要产生另一个线程发送邮件,但在测试程序中没有执行,在正常运行时会执行
target=new String("success");
return (mapping.findForward(target));//email resetting password token success,
//forward to emailSuccess.jsp;
}
/**
* process general error
* @param e error object
private void generalError(Exception e) {
e.printStackTrace();
__log.error(" [EmailResetPsd] Error - " + e.getMessage());
}*/
}
这时对应的测试程序:
//$Id: EmailResetPsdActionTest.java,v 1.3 2005/12/19 16:00:49 dashing_meng Exp $
//Copyright (c) 2004-2005 Http://www.learndiary.com. All Rights Reserved.
//Permission to use, copy, modify, and distribute this software and its
//documentation without fee, and without a written agreement is hereby
//granted, provided that the above copyright notice and this paragraph
//appear in all copies. This software program and documentation are
//copyrighted by http://www.learndiary.com. The software program and
//documentation are supplied "AS IS", without any accompanying services
//from The LearnDiary. The LearnDiary does not warrant that the operation
//of the program will be uninterrupted or error-free. The end-user
//understands that the program was developed for research purposes and is
//advised not to rely exclusively on the program for any reason.
//IN NO EVENT SHALL HTTP://WWW.LEARNDIARY.COM BE LIABLE TO ANY PARTY FOR
//DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES,
//INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS
//DOCUMENTATION, EVEN IF HTTP://WWW.LEARNDIARY.COM HAS BEEN ADVISED OF THE
//POSSIBILITY OF SUCH DAMAGE. HTTP://WWW.LEARNDIARY.COM SPECIFICALLY
//DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
//WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
//SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND
//HTTP://WWW.LEARNDIARY.COM HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE,
//SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
package com.learndiary.website.action.account;
import java.sql.Timestamp;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import servletunit.struts.MockStrutsTestCase;
import com.learndiary.website.actionform.EmailResetPsdForm;
import com.learndiary.website.dao.EmailResetPsdDAO;
import com.learndiary.website.dao.TransContext;
import com.learndiary.website.dao.UserDAO;
import com.learndiary.website.model.EmailResetPsdInfo;
import com.learndiary.website.model.UserInfo;
/**
* test EmailResetPsdAction
* @author http://www.learndiary.com, LearnDiary Develop Group
*/
public class EmailResetPsdActionTest extends MockStrutsTestCase {
Log log = LogFactory.getLog(EmailResetPsdActionTest.class.getName());
private transient TransContext globalTran = null;
UserDAO userDAO=null;
EmailResetPsdDAO emailResetPsdDAO=null;
//the contextDir can be commented by adding classpath:${web} into build.xml
//String contextDir = "E:\zhangwei\eclipse_workspace1\learndiary_login\web";
public EmailResetPsdActionTest(String testName) {
super(testName);
}
/**
* empty table "user" and "emailresetpsd";
* insert two user:"ppig" and "tom" into table user,
* "ppig" to test successful case,
* "tom" to test duplicate request failure case;
* insert a record into table emailresetpsd for
* "tom" to test duplicate request failure case.
* @see junit.framework.TestCase#setUp()
*/
public void setUp() throws Exception {
super.setUp();
//this.setContextDirectory(new File(contextDir));
log.debug("ahah");
globalTran = new TransContext();
userDAO = new UserDAO(globalTran);
emailResetPsdDAO=new EmailResetPsdDAO(globalTran);
//empty two tables
userDAO.deleteAll();
emailResetPsdDAO.deleteAll();
UserInfo info1=new UserInfo();//for testing successful request
info1.setUserName("ppig");
info1.setPsd("123456");
info1.setEmail("learndiary@126.com");
userDAO.insertObject(info1);
UserInfo info2=new UserInfo();//for testing duplicate request failure
info2.setUserName("tom");
info2.setPsd("223456");
info2.setEmail("tom@tom.com");
userDAO.insertObject(info2);
int userID2=((UserInfo)userDAO.findByName("tom")).getUserID();
EmailResetPsdInfo emailResetPsdInfo=new EmailResetPsdInfo();
emailResetPsdInfo.setUserID(userID2);
emailResetPsdInfo.setToken("12345678");
emailResetPsdInfo.setSendTime(new Timestamp(System.currentTimeMillis()-1000*60*2));
emailResetPsdDAO.insertObject(emailResetPsdInfo);
}
/**
* empty table "user" and table "emailresetpsd"
* @see junit.framework.TestCase#tearDown()
*/
public void tearDown() throws Exception {
super.tearDown();
userDAO.deleteAll();
emailResetPsdDAO.deleteAll();
}
/**
* request emailing resetting password token successfully
*/
public void testSuccess() {
// a valid request
setRequestPathInfo("/emailResetPsdAction");
EmailResetPsdForm form = new EmailResetPsdForm();
form.setUserName("ppig");
setActionForm(form);
actionPerform();
verifyForward("success");
// verifyForwardPath("/success.jsp");
// assertEquals("deryl",getSession().getAttribute("authentication"));
verifyNoActionErrors();
}
/**
* request emailing resetting password token failure
*
*/
public void testFailure() {
// fail when duplicate request
EmailResetPsdForm form = new EmailResetPsdForm();
form.setUserName("tom");
setRequestPathInfo("/emailResetPsdAction");
setActionForm(form);
actionPerform();
verifyForward("failure");
// fail when user not found
form = new EmailResetPsdForm();
form.setUserName("000000000000000");
setRequestPathInfo("/emailResetPsdAction");
setActionForm(form);
actionPerform();
verifyForward("failure");
verifyNoActionErrors();
}
public static void main(String[] args) {
junit.textui.TestRunner.run(EmailResetPsdActionTest.class);
}
}