20170727

问题描述

对于spring api的单元测试,我们一直使用MockMvc。而当我把@Runwith@SpringBootTest注释之后。发现使用McokMvc的单元测试仍然能够正常执行,最重要的是,不需要启动服务。那么对于单元测试这种运行机制到底是怎样的?

解决思路

  • Q1 :对于单元测试我们是否应该启动服务?
  • A1:对于单元测试,我们可能会在测试过程中使用Mockito进行某些类或者方法或者层的mock,因此我们需要介入服务的处理部分,因此我们不应该启动真的服务。

  • Q2:为什么不启动服务,MockMvc是如何采用发请求的方式测试,也能够正常的测试controller的功能?
  • A2:如果没有启动服务测试就可以运行成功,那么说明MockMvc模拟了一种路由匹配机制,匹配测试中的请求路径然后找出对应的controller然后对函数进行测试,这样就能解释当你的服务并没有被启动,却可以被controller服务。
    ---->因此MockMvc不能用来进行集成测试,因为他不能真正的去给服务器发送请求,所以没有办法测试服务器就收请求和对请求处理返回的过程

  • Q3:使用注释@Runwith和@SpringBootTest(classes = Application.class)有什么作用
  • A3:Junit4引入了测试注解@Runwit标注测试使用的Runner,一般都会用在测试类之前修饰测试类@SpringBootTest(classes = Application.class)加载运行类的所有资源,配置
  • *例子:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class,webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT,properties = {
        "server.port=8081"} )

第二个注解:加载服务类所需的所有资源配置,并设置服务启动端口是8081
第一个注解:作为运行器启动第二个注解引入的服务


  • Q4:那么对于单元测试到底需要哪些注解呢?
  • A4:因为单元测试不需要服务,因此我们不需要把服务资源都加载进来,然而我们需要Junit的于运行期运行测试,所以单元测试只需要@RunWith

反思

  • 当遇到一个问题,就去搜索怎么解决这个问题,找到答案直接粘上,而没有认真去查找这些东西作用都是什么,为什么这样可以解决。
    ----> action:以后遇到任何问题,写到记事本并且记录自己每一步骤的解决办法,然后晚上整理的时候添加why再去查资料。理解网上解决办法为什么这么做

你可能感兴趣的:(20170727)