Spring & Junit

1 测试基类(BaseJunit4Test)
import org.junit.runner.RunWith;
import org.springframework.context.ApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.transaction.TransactionConfiguration;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.transaction.annotation.Transactional;

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@Transactional
/**
 * defaultRollback: true > 测试数据不会污染数据库, false > 会真正添加到数据库当中
 * 当然这里不污染数据库只是在表中看不到数据, 但是如果你设置的主键是自动增长的话, 那么可以很明显得看出,虽然数据回滚了, 
 * 但是当你尝试不回滚新增数据到数据库的时候, 会发现ID不是连续的.所以并不是真正意义上的无污染
 * 当然,这种方式也有他的好处,比单纯JUNIT要省去@before ,@after的方法
 * */
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = false)
@ContextConfiguration(locations = { "classpath*:spring/application.xml", "classpath*:spring/plugin-*.xml" })
public class BaseJunit4Test extends AbstractJUnit4SpringContextTests {

    public <T> T getBean(Class<T> type) {
        return applicationContext.getBean(type);
    }

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

    protected ApplicationContext getContext() {
        return applicationContext;
    }
    
   /* @Test// 标明是测试方法
    @Transactional // 标明此方法需使用事务
    @Rollback(false) // 标明使用完此方法后事务不回滚,true时为回滚
    public void start() {

    }*/
}


2、测试Controller基类
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

import org.junit.Before;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.ResultActions;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(locations = { "classpath*:spring/application.xml", "classpath*:spring/plugin-*.xml" })
public class BaseMockMvcTest {

    @Autowired
    protected org.springframework.web.context.WebApplicationContext context;
    protected MockMvc                                               mockMvc;
    protected MockHttpServletRequest                                request;
    protected MockHttpServletResponse                               response;

    @Before
    public void before() {
        // 可以对所有的controller来进行测试
        mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
        // 仅仅对单个Controller来进行测试
        // mockMvc =
        // MockMvcBuilders.standaloneSetup(newMeunController()).build();
        request = new MockHttpServletRequest();
        request.setCharacterEncoding("UTF-8");
        response = new MockHttpServletResponse();
    }

    protected ResultActions getResultActions(String uri) {
        ResultActions actions = null;
        try {
            actions = this.mockMvc.perform(get("pmplocal.jd.net" + uri));
            out("status", status());
            out("content", content());
            actions.andExpect(status().isOk());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return actions;
    }

    protected void out(String key, Object obj) {
        System.out.println(key + " = " + obj);
    }
}


3、启动测试类
@RunWith(Suite.class)
@SuiteClasses({ UserTest.class, BookTest.class})
public class StartTest extends BaseJunit4Test {    

}

猜你喜欢

转载自liuzidong.iteye.com/blog/2301286