让我们想象一个 Spring 3.1 web mvc 应用程序通过 Hibernate JPA 通过 DAO 使用 MySql。
必须在不部署应用程序和使用内存数据库(hsqldb:mem
例如)的情况下为控制器编写测试。换句话说,应该能够在本地 PC 上运行测试。
如何做到这一点?有人可以提供一个详细的例子来说明如何为这样的控制器编写测试吗?应该怎么@ContextConfiguration
配置?如何在WebApplicationContext
本地检索用于测试目的?应该维护一个hibernate-test.cfg.xml
?
更新
我不只是在谈论单元测试,我在谈论集成测试。
解决方案
为了在肖恩帕特里克弗洛伊德的回答之上完成这一点,这里有一个灵感来自这里的解决方案:
服务示例:
public interface MarkingService {
public String markItem(String item);
}
使用服务的控制器示例
@Controller
public class TestableController {
@Autowired
private MarkingService markerService;
@RequestMapping(value = "mark/{name}")
public String mark(Model ui, @PathVariable String name){
String value = this.markerService.markItem(name);
ui.addAttribute("mark-value", value);
return "mark-show";
}
}
测试控制器的服务模拟:
public class MarkingServiceMock implements MarkingService {
@Override
public String markItem(String item) {
return "mockValue";
}
}
用于测试配置的配置对象:
@Configuration
public class TestableControllerConfig {
// We return a mock to test the controller layer
@Bean
public MarkingService markingService() {
return new MarkingServiceMock();
}
}
控制器测试:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes={TestableControllerConfig.class})
public class TestableControllerTest {
// Will be injected with TestableControllerConfig.markingService()
@Autowired
private MarkingService markerService;
@Test
public void testController() {
// ...
}
}
假设服务层依赖于 DAO,也很容易注入基于内存数据库的实现。