在做Struts的单元测试时我是使用的StrutsTest作为JUnit的扩展。  
但是在测试Action时会去访问数据库,而我的数据库是使用的Tomcat配置的数据源。  
这样就会出现一个异常javax.naming.NoInitialContextException:  Need  to  specify  class  name  in  environment  or  system  property,  or  as  an  applet  parameter,  or  in  an  application  resource  file:    java.naming.factory.initial  
如何加载Tomcat的配置文件,并且使用Tomcat数据源呢?  
 
 
测试代码:  
package  com.xxxxxx.prework.actions;  
 
import  java.io.File;  
 
import  servletunit.struts.MockStrutsTestCase;  
 
public  class  TestLoginAction  extends  MockStrutsTestCase  {  
 
           @Override  
           protected  void  setUp()  throws  Exception  {  
                       super.setUp();  
                       File  contextFile  =  new  File(  
                                               "C:\\eclipse\\eclipse  europa\\workspace\\Prework\\WebContent");  
                       this.setContextDirectory(contextFile);  
           }  
 
           @Override  
           protected  void  tearDown()  throws  Exception  {  
                       super.tearDown();  
           }  
 
           public  TestLoginAction(String  testName)  {  
                       super(testName);  
           }  
 
           public  void  testSuccessfulLogin()  {  
                       this.setRequestPathInfo("/loginAction");  
                       this.addRequestParameter("loginId",  "admin");  
                       this.addRequestParameter("password",  "admin");  
                       this.actionPerform();  
                       this.verifyForward("menu");  
                       this.verifyForwardPath("/jsp/Menu.jsp");  
           }  
}  
 
 
数据库访问代码:  
public  Connection  getConnection()  {  
           try  {  
                       Context  initialContext  =  new  InitialContext();  
                       Context  envContext  =  (Context)  initialContext  
                                               .lookup("java:/comp/env");  
                       DataSource  dataSource  =  (DataSource)  envContext  
                                               .lookup("OracleDAOFactory.DATASOURCE_DB_NAME");  
                       dbConn  =  dataSource.getConnection();  
           }  catch  (NamingException  e)  {  
                       logger.error("Database::Can  not  find  datasource");  
                       e.printStackTrace();  
           }  catch  (SQLException  e)  {  
                       logger.error("Database::Can  not  get  Connection");  
                       e.printStackTrace();  
           }  
           return  dbConn;  
}  
 
 
感觉这个问题挺麻烦的,因为数据源是需要Tomcat启动之后创建,而在做测试的时候是使用的Mock,并没有启动Tomcat~~~不知道有没有什么好的解决办法。  
或者说有什么其他好的办法来测试Struts的Action  
 
顺便说一下,我是是用的Struts  1.x

解决方案 »

  1.   

    你需要测试数据么?不需要为什么要链接数据库?
    使用mock。
      

  2.   

    你需要测试连接池么,不需要的话,直接使用一般的Connection就可以了.
      

  3.   

    flyforlove(吾将远去) 
    你的意思就是说测试数据和测试Action两个之间要分开咯~
    使用Mock来模拟数据吗?
    那能推荐点这方面的书籍或文章吗?
    刚开始学习测试,还不太熟悉这方面的东西~~
      

  4.   

    "你需要测试连接池么,不需要的话,直接使用一般的Connection就可以了."
    那岂不是得另写一套DAO出来~~
    感觉挺麻烦的~~
      

  5.   

    就是用mock来模拟你的dao,你是单体测试不是结合测试,不需要真正的和数据库进行交互。
    网上有mock工具,你自己找一下吧。
      

  6.   

    “就是用mock来模拟你的dao,你是单体测试不是结合测试,不需要真正的和数据库进行交互。
    网上有mock工具,你自己找一下吧。”哦~~~
    谢谢~~