java - 你如何使用 spring 的注入(inject)来对 Controller 进行单元测试?

标签 java spring junit easymock

我想测试我的 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/

相关文章:

java - 如何读取rdf :description inside annotation using OWL API

java - Spring 3 MVC 验证不起作用

spring - 如何将表单数据发送到 Controller

spring - spring mvc测试中访问请求体和请求头

java - GWTTestCase - 未找到测试

caching - Play 2.4 测试出错 : The CacheManager has been shut down. 无法再使用

java - 使用 Java 获取 URL 并删除 HTML 字符串中的第一个图像

java - 使用java从url中检索顶级域

java - 如何从listfragment java类进入其他 Activity

java - LDAP 术语中的 userDn 和 base 是什么