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 { }