1

让我们想象一个 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,也很容易注入基于内存数据库的实现。

4

1 回答 1

1

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

如果您要测试 web 控制器,请使用ModelAndViewAssert的 Mock 版本HttpServletRequest

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

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

于 2012-07-10T12:45:41.483 回答