Junit4在SSM中应用
项目背景
最近在看Spring相关知识,在看源码之后,注意到项目结构是包含main和test2个文件夹。main文件包含的当然是源文件,而test是针对src源文件构建的测试类。具体如图所示
单元测试:
web项目中怎么针对某一模块进行单元测试,我之前的方法是每次启动tomcat,然后通过页面点点去触发需要测试的代码。但这样会带来一个问题: 当项目小的时候,一切ok,没问题。但是当项目大了之后(比如我现在做的这个项目),每次启动都需要个10几秒。这种单元测试方式每次测试都会花费大量的时间在tomcat启动上,这其实不是我们想要的结果。
Junit4
JUnit是一个Java语言的单元测试框架,他可以帮助我们更加方便简介的进行单元测试。
Junit4 在SSM中的应用
1 pom.xml引入jar包:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
2 编写测试用例:
偷学spring中格式,在和main同级的目录下新建test文件,并把test文件 mark directory as—> test sources root.
//注解让测试运行于Spring测试环境。
@RunWith(SpringJUnit4ClassRunner.class)
//引入Spring配置
@ContextConfiguration({"classpath*:/dispatcher-servlet.xml", "classpath*:/mybatis-config.xml"})
public class TestWeChat {
@Test
public void testWeChat() {
List<String> strings = new ArrayList<>();
strings.add("34920");
strings.add("44568");
WeChatMsgUtils.sendBroadCast(strings, "测试微信发送消息");
WeChatMsgUtils.createSendGroupMsg(strings, "企业微信测试", "测试");
}
}
但是这样还不行,可能会报错:
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.web.servlet.resource.ResourceHttpRequestHandler#0': Invocation of init method failed; nested exception is java.lang.IllegalStateException: WebApplicationObjectSupport instance [ResourceHttpRequestHandler [locations=[class path resource [WEB-INF/resources/]], resolvers=[aaa@qq.com4a8bf1dc]]] does not run in a WebApplicationContext but in: aaa@qq.com72d818d1: startup date [Fri May 25 16:50:52 CST 2018]; root of context hierarchy
原因是:静态资源的Handler的ResourceHttpRequestHandler不能创建。那么我们可以通过指定静态资源位置来创建。
也就是加上
@WebAppConfiguration("src/main/resources")
@WebAppConfiguration注解在类上,用来声明加载的ApplicationContext是一个WebApplicationContext。它的属性指定的是Web资源的位置,默认为src/main/webapp。
继续运行 ,我擦,还是报错:
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'webSocketHandlerMapping' defined in class path resource [org/springframework/web/socket/config/annotation/DelegatingWebSocketConfiguration.class]:
这个报错的原因是因为,我们在项目中用到了websocket。
google之后,发现是缺少一个引用:
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-websocket</artifactId>
<version>7.0.52</version>
<scope>test</scope>
</dependency>
go on
终于没有报错了:结果如图所示:
总结
在ssm中使用junit4 其实只需要3步骤。
1 在pom.xml文件中引用对应的包:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
//项目中如果有用到websocket,需要添加下面的包,没用到就算了
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-websocket</artifactId>
<version>7.0.52</version>
<scope>test</scope>
</dependency>
2 编写对应的测试类:
//注解让测试运行于Spring测试环境。
@RunWith(SpringJUnit4ClassRunner.class)
//引入Spring配置
@ContextConfiguration({"classpath*:/dispatcher-servlet.xml", "classpath*:/mybatis-config.xml"})
@WebAppConfiguration("src/main/resources")
3 需要测试方法加上@Test:
@Test
public void testWeChat() {
List<String> strings = new ArrayList<>();
strings.add("34920");
strings.add("44568");
WeChatMsgUtils.sendBroadCast(strings, "测试微信发送消息");
WeChatMsgUtils.createSendGroupMsg(strings, "企业微信测试", "测试");
}
上一篇: Spring 控制反转(IoC)
下一篇: Spring IOC