2014-11-23 59 views
0

仿製品的行爲嗯,這是我的設置:無法使用爲的Mockito測試Struts2的action類方法

WelcomeUser.java

package org.user.www.action; 
import org.user.www.dao.ApplicationDAOfactory; 
import org.user.www.dao.UserPojoDao; 
import org.user.www.pojo.UserPojo; 

import com.opensymphony.xwork2.ActionSupport; 
import com.opensymphony.xwork2.ModelDriven; 

public class WelcomeUser extends ActionSupport implements ModelDriven<UserPojo> { 

private static final long serialVersionUID = 1L; 
private UserPojo userPojo = new UserPojo(); 
private ApplicationDAOfactory appFactory = new ApplicationDAOfactory(); 
private UserPojoDao appDAOObj /*= ApplicationDAOfactory.getUserPojoDaoInstance()*/; 

public WelcomeUser(){ 

} 

public WelcomeUser(UserPojoDao appDAOObj, ApplicationDAOfactory appFactory){ 
    this.appDAOObj = appDAOObj; 
    this.appFactory = appFactory; 
} 

public String execute(){ 
    return SUCCESS; 
} 
@Override 
public UserPojo getModel() { 
    // TODO Auto-generated method stub 
    return userPojo; 
} 

public String welcome(){ 
    appDAOObj = appFactory.getUserPojoDaoInstance(); 
    appDAOObj.persistUser(userPojo); 
    return SUCCESS; 
} 
} 

ApplicationDAOfactory.java

package org.user.www.dao; 

public class ApplicationDAOfactory { 

public UserPojoDao getUserPojoDaoInstance(){ 
    return new UserPojoDaoImpl(); 
} 
} 

WelcomeUserTest。 java

package org.user.www.junit; 

import static org.junit.Assert.assertEquals; 
import static org.mockito.Mockito.mock; 
import static org.mockito.Mockito.when; 

import java.util.HashMap; 
import java.util.Map; 

import org.apache.struts2.StrutsJUnit4TestCase; 
import org.junit.Before; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.mockito.Mock; 
import org.mockito.runners.MockitoJUnitRunner; 
import org.user.www.action.WelcomeUser; 
import org.user.www.dao.ApplicationDAOfactory; 
import org.user.www.dao.UserPojoDao; 
import org.user.www.dao.UserPojoDaoImpl; 
import org.user.www.pojo.UserPojo; 

import com.opensymphony.xwork2.ActionContext; 
import com.opensymphony.xwork2.ActionProxy; 

@RunWith(MockitoJUnitRunner.class) 
public class WelcomeUserTest extends StrutsJUnit4TestCase<WelcomeUser>{ 

@Mock private UserPojoDao appDAOObj; 
@Mock private ApplicationDAOfactory appFactory; 
@Mock private UserPojo userPojo; 

@Before 
public void setUpBeforeClass() throws Exception { 
    appDAOObj = mock(UserPojoDaoImpl.class); 
    appFactory = mock(ApplicationDAOfactory.class); 
    //MockitoAnnotations.initMocks(WelcomeUser.class); 
    new WelcomeUser(appDAOObj, appFactory); 

} 

@Test 
public void testWelcome() throws Exception{ 
    when(appFactory.getUserPojoDaoInstance()).thenReturn(appDAOObj); 
    when(appDAOObj.persistUser(userPojo)).thenReturn(userPojo); 
    Map<String, Object> paramMap = new HashMap<String, Object>(); 
    paramMap.put("name" ,"user"); 
    paramMap.put("email" ,"[email protected]"); 
    ActionProxy proxy = getActionProxy("/submitUser"); 
    ActionContext actionContext= proxy.getInvocation().getInvocationContext(); 
    actionContext.setParameters(paramMap); 
    String result= proxy.execute(); 
    assertEquals("success", result); 
} 

} 

我的疑問是,儘管我試圖模擬struts action類中的歡迎方法所依賴的行爲,但似乎並不奏效。我瀏覽過各種資源,但都沒有成功。據我已經能夠理解這種情況,我最好的猜測是,當我在我的測試方法中的代理實例調用execute方法時,控件根據struts.xml文件中的映射執行welcome方法,但是在執行時到達我期待我的模擬工作的地方,它不起作用,並擊中我不想要的數據庫。我理解我的理解肯定存在差距,但任何幫助都不勝感激。乾杯!!

回答

0

我有類似的問題,但我的情況有點不同,因爲我通過彈簧框架使用setter Injector,而我的動作類已經有了Dao的setter方法。

我不得不從代理中獲取動作,並將嘲笑的Dao對象注入到我的動作中。 我沒有執行代理之前,以下幾點:

WelcomeUser actionObj = (WelcomeUser) proxy.getAction(); 
actionObj.setDaoObj(appDAOObj); 

你必須想出一個辦法來注入嘲笑的對象爲actionObj。

更新:

檢查以下爲您

WelcomeUser actionObj = (WelcomeUser) proxy.getAction(); 
ReflectionTestUtils.setField(actionObj, "appDAOObj", appDAOObj); 
ReflectionTestUtils.setField(actionObj, "appFactory", appFactory); 
String result= proxy.execute(); 
assertEquals("success", result); 

作品請確保您有彈簧試驗xxxRELEASE.jar和彈簧核心xxxRELEASE.jar(包括任何其他的依賴)在你的類路徑中。

相關問題