junit单元测试web项目的方法

是测试controller层用的

在项目开发中,常通过junit单元测试来测试自己方法逻辑。下面主要展示,junit测试web项目的方法步骤。包括service、dao层的方法和使用Mock测试cotroller层的方法。
以下测试用例时基于公司的项目展示的,所以不便于粘贴所有的源码

junit测试环境依赖

<dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.1.1</version>
        </dependency>
    &lt;dependency&gt;
        &lt;groupId&gt;org.springframework&lt;/groupId&gt;
        &lt;artifactId&gt;spring-test&lt;/artifactId&gt;
        &lt;version&gt;4.2.1&lt;/version&gt;
    &lt;/dependency&gt;

junit测试service,dao层

BaseTest类介绍

@ActiveProfiles(“dev”) 设置项目启动的环境
@ContextConfiguration加载配置文件,完成springIOC注入

@ActiveProfiles("dev")
@ContextConfiguration(locations = {
		"classpath:applicationContext.xml"
})
public class BaseTest extends AbstractJUnit4SpringContextTests {
public &lt;T&gt; T getBean(Class&lt;T&gt; type){
    return applicationContext.getBean(type);
}

public Object getBean(String beanName){
    return applicationContext.getBean(beanName);
}
protected ApplicationContext getContext(){
    return applicationContext;
}

}

具体的测试类

使用@Autowired引入dao/service包下面的对象。

public class DataMigrateScriptLogicTest extends BaseTest {
@Autowired
private DataMigrateScriptLogic dataMigrateScriptLogic;

@Test
public void test(){
    dataMigrateScriptLogic.dataMigrateCommand();
}

}

遇到一个问题

WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext(); wac == null

分析原因: ContextLoader类是web容器启动时,才会把ApplicationContext的上下文加载出来。即是通过web.xml文件中的org.springframework.web.context.ContextLoaderListener类来设置ApplicationContext的上下文。但是,以上的junit测试配置不能完成上下文的设置。

public static WebApplicationContext getCurrentWebApplicationContext() {
		ClassLoader ccl = Thread.currentThread().getContextClassLoader();
		if (ccl != null) {
			WebApplicationContext ccpt = currentContextPerThread.get(ccl);
			if (ccpt != null) {
				return ccpt;
			}
		}
		return currentContext;
	}

  
  

如果代码中使用了ContextLoader.getCurrentWebApplicationContext()来获取bean,那么只要在测试用例启动时设置如下代码即可。

@Before
    public void setApplication(){
        MockServletContext sc = new MockServletContext("");
        sc.addInitParameter(ContextLoader.CONFIG_LOCATION_PARAM, "/applicationContext.xml");
        ServletContextListener listener = new ContextLoaderListener();
        ServletContextEvent event = new ServletContextEvent(sc);
        listener.contextInitialized(event);
    }

  
  

junit测试controller层

以下代码是可以用来测试controller接口。展示了post请求和get请求的简单测试。

@ActiveProfiles("dev")
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(locations = {"classpath:applicationContext.xml","classpath:servlet-context.xml"})
// 无论接口调用成功或者失败,都将事物回滚
@Rollback
public class ReplenishControllerTest {
private MockMvc mockMvc;
@Autowired
WebApplicationContext webApplicationContext;

@Before
public void setUp(){
    mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
}

@Test
public void postTest(){
    String url = "/replenish/replenishAuctionStatus";
    Map&lt;Object,Object&gt; objectMap = Maps.newHashMap();
    objectMap.put("auctionGoodId",1);
    objectMap.put("success",false);
    objectMap.put("cardNum","1232134");
    try {
        mockMvc.perform(MockMvcRequestBuilders.post(url)
                .accept(MediaType.APPLICATION_FORM_URLENCODED_VALUE)
                .contentType(MediaType.APPLICATION_FORM_URLENCODED_VALUE)
                .param("auctionGoodId","1")
                .param("success","false")
                .param("cardNum","123")
                .accept(MediaType.APPLICATION_JSON))
                .andDo(MockMvcResultHandlers.print()).andReturn();

    } catch (Exception e) {
        e.printStackTrace();
    }
}
@Test
public void getTest(){
    String url = "/replenish/get";
    try {
        mockMvc.perform(MockMvcRequestBuilders.get(url)
                .accept(MediaType.APPLICATION_FORM_URLENCODED_VALUE)
                .contentType(MediaType.APPLICATION_FORM_URLENCODED_VALUE)
                .content("")
                .accept(MediaType.APPLICATION_JSON))
                .andDo(MockMvcResultHandlers.print()).andReturn();

    } catch (Exception e) {
        e.printStackTrace();
    }
}

}

发布了244 篇原创文章 · 获赞 2 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_44813090/article/details/105174602