如何使用弹簧注射器对控制器进行单元测试?

Bla*_*man 7 java junit spring easymock

我想测试我的spring mvc控制器.

控制器有一项服务:

@Autowired
UserService userService
Run Code Online (Sandbox Code Playgroud)

我的用户服务依赖于(自动装配)我的UserDao和其他一些服务,如mongoDb等.

现在我希望在我的UserService中测试业务逻辑,但是当然我想模拟来自UserDao和Mongodb等的响应.

如何正确设置单元测试?

我可以重新使用包含所有bean等的spring容器的xml文件,还是创建一个新的? (我假设我必须在这里涉及弹簧容器)

寻找一些指导,任何教程将不胜感激.

更新

我觉得奇怪的是,对于我的spring控制器(没有从Controller实现),我能够访问我的私有变量来手动设置我的服务,即:

@Controller
public class UserController {

   @Autowired
   UserService userService;
}
Run Code Online (Sandbox Code Playgroud)

在我的单元测试中,我可以这样做:

UserController controller = new UserController();
controller.userService = ....
Run Code Online (Sandbox Code Playgroud)

但是对于我自己的UserDao自动装配的UserService,我无法访问userDao属性:

UserService userService = new UserServiceImpl();
userService.userDao = .... // not available
Run Code Online (Sandbox Code Playgroud)

它是有意义的,因为它是私有的,但它如何为我的控制器工作?

Tre*_*ein 5

Spring框架具有非常有趣的测试功能.您可以查看Spring参考指南.它甚至可以在您的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...
}
Run Code Online (Sandbox Code Playgroud)

简而言之,您可以使用自己的applicationContext.xml,甚至可以定义一个新的仅用于测试.我个人使用另一个,因为我定义了另一个专用于测试目的的dataSource.