2012-01-02 31 views
7

我想测试我的弹簧mvc控制器。你如何使用弹簧的注射器来对控制器进行单元测试?

该控制器具有服务:

@Autowired 
UserService userService 

而且我的用户服务取决于(自动连接)我userDAO的和其他一些服务,如MongoDB的等

现在我想的业务逻辑中进行测试我的用户服务,但当然我想嘲笑我的UserDao和Mongodb等的回应。

如何正确设置我的单元测试?

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

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

更新

我感到奇怪的是,我的春天控制器(即不从控制器实现)我可以访问我的私人varialbe手动设置我的服务,即:

@Controller 
public class UserController { 

    @Autowired 
    UserService userService; 
} 

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

UserController controller = new UserController(); 
controller.userService = .... 

但我UserService,其中有userDAO的自动装配,我无法访问userDao属性:

UserService userService = new UserServiceImpl(); 
userService.userDao = .... // not available 

它是有道理的,因为它是私人的,但它是如何工作的我的控制器?

+1

回复:更新,什么包控制器,服务,并在测试?如果测试在同一个包中,则它可以访问默认范围的属性。忽略访问修饰符不*不*使私有财产,而[包私有(http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html)。 – 2012-01-02 15:26:10

+0

我有他们在同一个包。啊,我明白了,我认为这是私人的。我想知道为什么IntelliJ在重构期间默认情况下使字段私有。所以我应该把它们作为私人包裹呢? – Blankman 2012-01-02 15:31:15

+1

没有“应该”,它只取决于。我唯一关心包私有的问题是,你仍然可能无意中访问某些东西;我倾向于保持私事和使用制定者,但是meh。 – 2012-01-02 15:32:31

回答

5

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甚至定义只是为了测试一个新的。由于我定义了另一个专用于测试目的的数据源,因此我个人使用了另一个。

4

我感到奇怪的是,我的春天控制器(即不从控制器实现)我可以访问我的私人varialbe手动设置我的服务,即:

这很容易:在非私人的变数。

它具有默认可见性(“包私人”)。这意味着你可以从同一个包的所有类中访问它们。

所以如果你有一个共同的结构,那么控制器和控制器测试用例都在同一个包中。因此,您可以修改(“包私人”)控制器字段。但是控制器测试用例和服务不在同一个包装中,因此您无法访问(“包装专用”)服务字段。

1

我可以重新使用弹簧容器的xml文件,其中包含我所有的豆类 等或我创建一个新的? (我假设我必须得到弹簧 容器在这里)

我会建议反对创建新的XML文件。你最终会重复很多东西,而且很难维护。会有配置文件的扩散。您将测试所需的配置置于不同的xml中,甚至不应将其部署到生产环境中。至于为你的bean使用config,你可以使用@Trein建议的机制。

对于一般的测试春天contrller,你也可能会发现这SO Thread有用。

希望有所帮助。

相关问题