2011-04-28 31 views
4

有一个用于测试Struts2动作的struts2-junit插件,但它似乎需要测试以JUnit 3风格编写,也就是说我不能使用@BeforeClass,@Test等注释,并且不能使用BDD-样式测试名称,如“shouldDoThisAndThat()”。有没有办法将struts2-junit-plugin和JUnit 4-style测试结合起来?如何在Junit 4中测试Struts2的行为?

回答

1

我有同样的问题,这里是我如何解决它,它是一个非常简单的基类。

在我的情况下,我使用休眠,所以如果不使用它,请忽略会话/事务处理。 这让我们继续使用我发现的所有模拟struts对象。一个简单的测试案例如下。

我仍然需要弄清楚如何注入资源包(i18n字符串)......我将添加到基类。

package com.accelarad.unittest; 

import org.apache.struts2.StrutsTestCase; 
import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.junit.AfterClass; 
import org.junit.Before; 
import org.junit.BeforeClass; 
import org.junit.runner.RunWith; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.ApplicationContextAware; 
import org.springframework.orm.hibernate3.SessionFactoryUtils; 
import org.springframework.orm.hibernate3.SessionHolder; 
import org.springframework.test.context.ContextConfiguration; 
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 
import org.springframework.transaction.support.TransactionSynchronizationManager; 
import org.springframework.web.context.WebApplicationContext; 

/** 
* Bring Struts JUnit3 into the JUnit4 world 
* 
* @author kcostilow 
* 
*/ 
@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration({ 
    "classpath:spring-datasource-unittest.xml", 
    "classpath:spring-test-hibernate.xml", 
    "classpath:spring-context.xml", 
    "classpath:spring-security.xml", 
    "classpath:spring-server.xml" 
    } 
) 
public abstract class AbstractSpringStruts2JUnit4 extends StrutsTestCase implements ApplicationContextAware { 

    protected ApplicationContext applicationContext; 

    @Autowired 
    protected SessionFactory sessionFactory; 

    // implements ApplicationContextAware 
    public void setApplicationContext(ApplicationContext applicationContext) { 
     this.applicationContext = applicationContext; 
    } 

    @BeforeClass 
    public static void initialize() { 
     // in my case, I create a mock JNDI here, 
     // including a mailSession using a Wiser mock SMTP server 
    } 

    @Before 
    public void setUp() throws Exception { 
     super.setUp(); // use JUnit3 setUp chain. In this case setupBeforeInitDispatcher() will be called 
     if (! TransactionSynchronizationManager.hasResource(sessionFactory)) { 
      Session session = SessionFactoryUtils.getSession(sessionFactory, true); // first @Before only 
      TransactionSynchronizationManager.bindResource(sessionFactory, new SessionHolder(session)); 
     } 
    } 

    @Override 
    protected void setupBeforeInitDispatcher() throws Exception { 
     servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, applicationContext); 
     // inject hibernate sessionFactory into Transaction Management, simulating OpenSessionInView 
    } 

    @AfterClass 
    public static void shutdown() { 
     // in my case, I shutdown the mock mail server here 
    } 
} 

样品测试案例:

public class MyActionTest extends AbstractSpringStruts2JUnit4 { 
    @Test 
    public void testOneStrutsAction() throws Exception { 
     ActionProxy proxy = super.getActionProxy("/packageName/actionName"); 
     TestCase.assertEquals("actionName result", "success", proxy.execute()); 

     MyAction myAction = (MyAction) proxy.getAction(); 
     TestCase.assertNotNull(myAction.getSomething()); 
    } 
} 

你可以把它从那里我想。

+0

重新国际化:从Struts文件已经在我的类路径中,上面的结构已经引入了我的字符串属性文件,所以我不必为getText()工作额外做任何事情。 – kcostilow 2011-10-19 15:21:19

0

对于其他人谁降落在这里寻找如何测试使用JUnit Struts2的行动,这是一个使用Struts2.3.12 & JUnit 4中

public class TestIoOptimizationAction extends StrutsJUnit4TestCase<IoOptimizationAction> { 

    @Test 
    public void login() throws Exception { 
     request.setParameter("email", "[email protected]"); 
     request.setParameter("password", "22"); 

     ActionProxy proxy = getActionProxy("login"); 
     Map<String, Object> sessionMap = new HashMap<String, Object>(); 
     proxy.getInvocation().getInvocationContext().setSession(sessionMap); 
     String result = proxy.execute(); 
//  String result = executeAction("/login"); 
     assertEquals("success", result); 
     System.out.println(response.getContentAsString()); 
    } 
} 

我必须单独嵌入会话映射一些示例代码,因为我使用getActionProxy()和这里的reason

0

你的测试类应该扩展StrutsSpringJUnit4TestCase。

0

我偷kcostilow一点点,coding_idiot的解答和StrutsJUnit4TestCase创建一个抽象类:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration({ 
    "classpath:spring-datasource-unittest.xml", 
    "classpath:spring-test-hibernate.xml", 
    "classpath:spring-context.xml", 
    "classpath:spring-security.xml", 
    "classpath:spring-server.xml" 
    } 
) 
@Transactional 
@TransactionConfiguration(transactionManager = "dataSourceTransactionManager") 
public abstract class AbstractSpringStruts2JUnit4<T extends ActionSupport> extends StrutsJUnit4TestCase<T> { 

    @Autowired 
    @Qualifier("dataSource") 
    public void setDataSource(DataSource dataSource) { 
     this.dataSource= dataSource; 
    } 

    @Before 
    public void onSetUp() throws Exception { 
     super.setUp(); 
     setupAction(); 
    } 

    protected abstract void setupAction(); 

} 

然后扩展的类来创建测试:

public class SomeActionIntegrationTest extends AbstractSpringStruts2JUnit4<SomeAction> { 
    private SomeAction someAction; // SomeAction must extend ActionSupport. 

    @Override 
    protected void setupAction() { 
     ActionProxy proxy = super.getActionProxy("/someAction"); 
     // You might have* to add ".do" to the end of the URI. 
     So, super.getActionProxy("/someAction.do") was the only way I was able to get the proxy. 

     someAction = (ActionSupport) proxy.getAction(); 
     assertNotNull(someAction); 
    } 

    @Test 
    public void testExecute() throws Exception { 
     String result = someAction.execute(); 
     assertEquals("input", result); 
    } 
} 
相关问题