我想测试我的 spring mvc Controller 。
Controller 有一个服务:
@Autowired
UserService userService
我的用户服务依赖于(自动连接)我的 UserDao 和一些其他服务,如 mongoDb 等。
现在我想在我的 UserService 中测试业务逻辑,但当然我想模拟来 self 的 UserDao 和 Mongodb 等的响应。
如何正确设置我的单元测试?
我可以重新使用包含我的所有 bean 等的 spring 容器的 xml 文件,还是创建一个新文件?(我假设我必须在这里涉及到 spring 容器)
寻找这方面的一些指导,任何教程将不胜感激。
更新
我觉得奇怪的是,对于我的 spring Controller (不是从 Controller 实现的),我能够访问我的私有(private)变量来手动设置我的服务,即:
@Controller
public class UserController {
@Autowired
UserService userService;
}
在我的单元测试中我可以做:
UserController controller = new UserController();
controller.userService = ....
但是对于 Autowiring 了 UserDao 的 UserService,我无法访问 userDao 属性:
UserService userService = new UserServiceImpl();
userService.userDao = .... // not available
这是有道理的,因为它是私有(private)的,但它如何为我的 Controller 工作?
最佳答案
Spring 框架具有非常有趣的测试功能。你可以看看Spring reference guide .它甚至可以在您的 JUnit 测试类中提供 DI。
@RunWith(SpringJUnit4ClassRunner.class)
// ApplicationContext will be loaded from "/applicationContext.xml" and "/applicationContext-test.xml"
// in the root of the classpath
@ContextConfiguration(locations={"/applicationContext.xml", "/applicationContext-test.xml"})
public class MyTest {
// class body...
}
简而言之,您可以使用自己的applicationContext.xml,甚至可以定义一个新的仅用于测试。我个人使用不同的数据源,因为我定义了另一个专用于测试目的的数据源。
关于java - 你如何使用 spring 的注入(inject)来对 Controller 进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8702395/