gpt4 book ai didi

java - 如何使用@ContextConfiguration在本地和内存中测试Web Spring应用程序?

转载 作者:太空宇宙 更新时间:2023-11-04 08:09:49 25 4
gpt4 key购买 nike

让我们想象一个 Spring 3.1 Web mvc 应用程序通过 Hibernate JPA 通过 DAO 使用 MySql。

必须为 Controller 编写测试,而无需部署应用程序和使用内存数据库(例如 hsqldb:mem)。换句话说,应该能够在本地 PC 上运行测试。

如何实现这一目标?有人可以提供如何为此类 Controller 编写测试的详细示例吗? @ContextConfiguration 应该如何配置?如何检索 WebApplicationContext 以进行本地测试?应该维护一个 hibernate-test.cfg.xml 吗?

更新

我不仅仅在谈论单元测试,我还在谈论集成测试。

解决方案

为了在肖恩·帕特里克·弗洛伊德(Sean Patrick Floyd)的回答之上完成此任务,这里有一个受here启发的解决方案。 :

服务示例:

public interface MarkingService {
public String markItem(String item);
}

Controller 使用服务的示例

@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";

}

}

测试 Controller 的服务模拟:

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();
}

}

Controller 测试:

@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,那么基于内存数据库注入(inject)实现也很容易。

最佳答案

通常,您不会测试整个设置。为 Web 层编写测试并在其中模拟持久层。为服务层和持久层编写单独的测试。

如果您要测试 Web Controller ,请使用 ModelAndViewAssertthe Mock versions of HttpServletRequest etc.

另一方面,如果您想测试整个设置,请使用 HtmlUnit、Selenium 等运行自动化 Web 测试,但要在实际部署的应用程序上进行(当然是在非公开安装上)。

但在我看来,如果你想测试大局,你需要测试真实的东西。大规模的 mock 会变得非常困惑。

关于java - 如何使用@ContextConfiguration在本地和内存中测试Web Spring应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11413396/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com