junitユニットがwebプロジェクトをテストする方法

4926 ワード

プロジェクト開発ではjunitユニットテストによって自分のメソッドロジックをテストすることが多い.以下では、junitがwebプロジェクトをテストする方法の手順を主に示します.サービス、dao層の方法、およびMockを用いてcotroller層を試験する方法を含む.以下のテスト例は、会社のプロジェクトに基づいて表示されるため、すべてのソースコードを貼り付けるのは不便です.

junitテスト環境依存


            junit
            junit
            4.1.1
        

        
            org.springframework
            spring-test
            4.2.1
        

junitテストサービス、daoレイヤ


BaseTestクラスの紹介


@ActiveProfiles("dev")プロジェクト開始環境を設定@ContextConfigurationプロファイルをロードしspringIOC注入完了
@ActiveProfiles("dev")
@ContextConfiguration(locations = {
		"classpath:applicationContext.xml"
})
public class BaseTest extends AbstractJUnit4SpringContextTests {

    public  T getBean(Class 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;
	}

コードにbeanを取得するためにContextLoader.getCurrentWebApplicationContext()が使用されている場合は、試験例の起動時に以下のコードを設定すればよい.
@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 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();
        }
    }
}