在开发阶段对表现层进行测试
之前在做测试的时候,我们对Dao层做了测试,对Service层做了测试,但是在测试表现层的时候,我们并不是在测试类中启动的Web端口,还是直接启动了引导类,并在浏览器中打开本地网址或者用PostMan进行的测试,但是我们现在想在启动测试类的时候就启动Web环境,这个需求要如何解决呢?
在启动测试类的时候启动Web环境
之前我们在介绍@SpringBootTest注解的时候提到过一个属性,属性名叫做WebEnvironment,这个属性就是控制启动测试类的时候是否启动Web环境,这个属性的属性值有四个:
NONE:表示不启动
MOCK:默认值,也是不启动
DEFINED_PORT:在默认的端口启动Web环境
RANDOM_PORT:在随机的端口启动Web环境
我们先看一下正常启动测试类的情况:
我们准备一个测试类,然后启动测试类,主要观察在控制台输出的内容:
控制台上的输出内容很少,并且很明显没有任何的和Web环境有关的内容,很明显我们的Web环境并没有启动,现在我们设置在默认端口上启动测试用例:
这次我们依然注意观察控制台上的输出内容,看和上次有什么不同
可以看到这输
可以看到这次输出的日志内容多了很多,并且也带有端口号,说明我们的测试用例已经在Web端启动了。
模拟发送请求
在之前的操作中,我们已经开启了Web环境,现在要做的就是在测试类中的Web环境下发送请求,这里引入一个概念叫做虚拟请求,大概意思就是说我的这次请求并不是真实发生在浏览器中的,而是我为了测试而做的模拟请求,要发送虚拟请求,首先要做以下这几件事:
首先是准备一个发送请求的Controller:
然后开启发送虚拟请求的注解:
这个注解添加在测试注解下面,是一个类注解,表示在测试类中自动配置一个可以发送虚拟请求的对象
那么接下来,就是拿到这个发送虚拟请求的对象:
这个MockMvc对象不是我们自己配置的,是当我们在写完@AutoConfigureMockMvc注解之后,他自己帮我们配置好并放在Spring容器中的,我们可以通过自动装配的方式获取这个对象,还有一种方式,我们之前在学习Spring的时候介绍过,可以在处理器的形参上引入仅在此方法中可以使用的对象:
这两种方法使用哪一种都可以,只要能引入发送虚拟请求的对象即可,然后就是对象调用方法发送虚拟请求:
首先确定perfrom()方法是用来执行发送请求的,然后这个方法里面要一个参数,快速创建未知方法参数对象的方法就是先在方法参数的位置输入一个变量名,然后会报出异常,鼠标悬浮在异常的位置自动修复一场即可快速创建方法参数对象:
可以看到方法的参数最终创建出了一个RequestBuilder类型的对象,我们点进去这个对象看一下里面是什么:
可以看到这是一个接口,并且这个接口有五个实现类,我们最终使用的是他的实现类,也就是MockMvcRequestBuilder这个类:
这个类并不是new出来的,而是使用builder构造出来的,传入的参数就是你要发送请求的地址
这个地址,完整的地址是这样的
http://localhost:8080/text
但是我们在测试类中的测试环境已经帮我们自动填充上了前面的前缀,我们只需要填写处理器的地址就可以了。
最终我们启动这个测试类,看一下最终的输出结果;按照我们的预想,首先这个测试会启动Web环境,并且会发送请求到处理器,处理器方法会执行。现在我们直接启动看结果:
很好,很顺利地输出了我们再Controller中添加的内容和语句,这里要注意的是,他并不是会一直保留这个Web环境,而是发送一次请求,或者将测试类中的请求代码都执行完毕之后,这个临时的Web环境就会关闭,并不会一直保持端口的开启。