JUnit,Logback,带有Maven 3的Maven

在本系列中,我们已经学习了建立基本的Spring MVC应用程序并学习了如何在Spring MVC中处理表单 。 现在该讨论更多涉及的主题了。 但是,在我们涉足更深的领域之前,让我们先进行一些基础设置。

单元测试

我不是TDD传播者。 我在那里说了。 我从来没有能够编写任何软件的地方,对于每段代码,我都先编写了一个测试,然后编写了代码。 如果您已经这样做并且被编码所雇用,请告诉我。 我很想了解你。 说真的

我对TDD的意见分歧到此为止。 除了在代码之前编写测试(某种程度上我根本无法动动脑筋)之外,我还是单元测试的大力支持者。 我坚信使用JUnit测试所有功能(公共但非getter设置器,方法)。 我非常喜欢使用cobertura报告代码覆盖率。 我是maven的忠实拥护者,它使我只需一个命令就可以将它们整合到一个漂亮HTML报告中。

我将在本系列中使用JUnit 4。 让我们添加依赖项。

档案:\ pom.xml

<properties>                                                     <junit.version>4.10</junit.version>
</properties>  <!-- Unit testing framework. -->       
<dependency>                           <groupId>junit</groupId>           <artifactId>junit</artifactId>     <version>${junit.version}</version><scope>test</scope>                
</dependency>

让我们添加一个哑类来演示测试。

文件:/src/main/java/org/academy/HelloWorld.java

package org.academy;public class HelloWorld {private String message = 'Hello world. Default setting.'; public String greet(){return message; }public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}
}

最后是JUnit对其进行测试。

文件:src / test / java / org / academy / HelloWorldTest.java

package org.academy;import static org.junit.Assert.*;import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class HelloWorldTest {@AutowiredHelloWorld helloWorld;private final static Logger logger = LoggerFactory.getLogger(HelloWorldTest.class);@Testpublic void test() {    logger.debug(helloWorld.greet());assertEquals(helloWorld.greet(), 'Hello world, from Spring.');}
}

您可能已经注意到,单元测试中的helloWorld从未在代码中初始化。 这就是Spring的IoC魅力 。 为了使这项工作有效,我们使用了@ RunWith,@ ContextConfiguration和@Autowired。 而且我还为Spring提供了足够的信息,使其能够创建HelloWorld实例,然后将其注入到HelloWorldTest.helloWorld中。 另外,assertEquals正在检查与HelloWorld类中实际硬编码的消息完全不同的消息。 这是在下面提到的xml文件中完成的。 请注意在Maven结构中文件的位置。

文件:/src/test/resources/org/academy/HelloWorldTest-context.xml

<?xml version='1.0' encoding='UTF-8'?>
<beans xmlns='http://www.springframework.org/schema/beans'xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:p='http://www.springframework.org/schema/p'xmlns:context='http://www.springframework.org/schema/context'xsi:schemaLocation='http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-3.0.xsd'><bean id='helloWorld' class='org.academy.HelloWorld'><property name='message' value='Hello world, from Spring.' /></bean>
</beans>

我可以通过多种方式将此配置文件提供给单元测试。 @RunWith(SpringJUnit4ClassRunner.class)是很不错的添加,但不是必需的 。 我在这里提供的只是在大多数情况下都可以使用的香草方法,但我鼓励观众进行试验。

单元测试范围/代码范围。

对于个人/开发人员和技术主管而言,我认为关于自动/半自动/简便的代码覆盖率报告的重要性还没有足够的评论。 除非您虔诚地实践TDD(以我之前从未提到过的方式进行过实践),否则即使是单个开发人员也绝对不可能知道单元测试是否涵盖了代码的所有逻辑分支。 我什至不打算谈论团队/组织的技术负责人如何确保其产品经过充分的单元测试。 我个人认为,任何未经足够的单元测试和报告测试范围的软件产品,都是无法接受的风险。 期。 诚然有一点硬性立场,但事实就是如此。

我对强硬立场的坚定信念来自这样一个事实,即报告测试覆盖率是如此容易。 在此示例中,我将使用cobertura。 您需要将cobertua添加到Maven pom。

档案:pom.xml

<!-- Reporting -->                                              
<plugin>                                                              <groupId>org.apache.maven.plugins</groupId>                       <artifactId>maven-site-plugin</artifactId>                        <version>3.0</version>                                            <configuration>                                                   <reportPlugins>                                               <!-- Reporting on success / failure of unit tests -->     <plugin>                                                  <groupId>org.apache.maven.plugins</groupId>           <artifactId>maven-surefire-report-plugin</artifactId> <version>2.6</version>                                </plugin>                                                 <!-- Reporting on code coverage by unit tests. -->        <plugin>                                                  <groupId>org.codehaus.mojo</groupId>                  <artifactId>cobertura-maven-plugin</artifactId>       <version>2.5.1</version>                              <configuration>                                       <formats>                                         <format>xml</format>                          <format>html</format>                         </formats>                                        </configuration>                                      </plugin>                                                 </reportPlugins>                                              </configuration>

完成此操作并添加JUnit并添加实际的JUnit测试后,您只需要运行

mvn -e clean install site

创建一个漂亮的基于HTML的代码覆盖率报告。 此报告将允许您单击被测试的源代码,并为单元测试的代码提供漂亮的绿色补丁,而对于那些通过裂缝的代码则为您提供红色的补丁。

记录中

Log4j很好, Logback更好 。 只是不要使用System.out.println()进行日志记录。

如果没有适当的日志记录,您可能会走很长一段路。 但是,我花了太多周末和晚上来追踪生产问题,而企业却深呼吸,希望有某种方法可以知道应用程序中发生的事情,而不用一味猜测。 如今,借助slf4j之类的成熟api和诸如logback之类的稳定实现,开发人员只需为每个类添加一条额外的行即可利用企业级日志记录基础架构。 从任何项目开始就不使用正确的日志记录只是没有意义的。

添加slf4j并重新登录到Maven依赖项。

文件:\ pom.xml。

<!-- Logging -->                            
<dependency>                                <groupId>ch.qos.logback</groupId>       <artifactId>logback-classic</artifactId><version>${logback.version}</version>   
</dependency>

确保排除了Spring的默认日志记录,即公共日志。 如果您想知道logback是否真的那么好,我声称这就是为什么Spring不选择它作为开始。 在我的辩护中,这是Spring官方博客上的链接 ,他们说:“如果我们可以倒计时并现在作为一个新项目启动Spring,它将使用不同的日志记录依赖性。 首选的可能是Java的简单日志记录外观(SLF4J),……”

文件:\ pom.xml。

<!-- Support for testing Spring applications with tooTestNG This artifact is generally always defined the integration testing framework and unit testin
<dependency>                                         <groupId>org.springframework</groupId>           <artifactId>spring-test</artifactId>             <version>${org.springframework.version}</version><scope>test</scope>                              <exclusions>                                     <exclusion>                                  <groupId>commons-logging</groupId>       <artifactId>commons-logging</artifactId> </exclusion>                                 </exclusions>                                    
</dependency>

提供用于注销的配置。

文件:/src/main/resources/logback.xml

<?xml version='1.0' encoding='UTF-8'?>
<configuration><appender name='CONSOLE' class='ch.qos.logback.core.ConsoleAppender'><encoder><pattern>%d %5p | %t | %-55logger{55} | %m %n</pattern></encoder></appender><logger name='org.springframework'><level value='INFO' /></logger><root><level value='DEBUG' /><appender-ref ref='CONSOLE' /></root>
</configuration>

最后,在每个需要记录的类(应该是所有类)的开始处添加一个魔术贴。

文件:src / test / java / org / academy / HelloWorldTest.java

[...]                                                    
private final static Logger logger = LoggerFactory  .getLogger(HelloWorldTest.class);           
[...]
logger.debug(helloWorld.greet());
[...]

你们都在那里准备好了。 现在是时候深入春天了。

快乐的编码。

想了解更多吗?

这里是本系列早期文章的链接。
Hello World with Spring 3 MVC
使用Spring 3 MVC处理表单

而且,当然强烈推荐
Spring 3使用JUnit 4进行测试。
使用Spring Framework运行单元测试 @RunWith JUnit4以及SpringJUnit4ClassRunner和参数化 Junit和Spring的问题。

在Tech for Enterprise博客上,来自我们的JCG合作伙伴 Partho的 参考资料: JUnit,Logback,Maven和Spring 3 。


翻译自: https://www.javacodegeeks.com/2012/07/junit-logback-maven-with-spring-3.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/371892.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Gradle中的buildScript,gradle wrapper,dependencies等一些基础知识

就想收藏一篇好文&#xff0c;哈哈&#xff0c;无他 Gradle中的buildScript代码块 - 黄博文 然后记录一些gradle的基础知识&#xff1a; 1.gradle wrapper就是对gradle的封装&#xff0c;可以理解为项目内部内置了gradle 2.dependencies的参数 上官方参数表https://docs.gradle…

phonegap工程中修改app的名字

针对phonegap比较高的版本&#xff0c;我的是6.4.0。 在phonegap工程中&#xff0c;当添加了iOS和android平台或多个平台后&#xff0c;工程进行了开发&#xff0c;然后觉得app的名字想修改一下&#xff08;比如在手机上显示的app名字&#xff0c;或者通过ipa导入安装或者apk包…

ac ap方案 华为_华为无线_AC+AP小型无线网络配置实验_v1

【如果在实验中有什么疑问&#xff0c;欢迎关注微信公众号“IT后院”给我留言&#xff0c;我会抽空回答你的问题】华为无线-ACAP小型无线网络配置实验_v1网络结构图&#xff1a;步骤一&#xff1a;配置网络连通性SW:interface Vlanif100ip address 192.168.0.1 255.255.255.0in…

css类选择器或逻辑,深入理解CSS中选择器的逻辑处理

在过去的很长一段时间中&#xff0c;我们都说 CSS 是不带有任何逻辑的&#xff0c;意思是在 CSS 中没有控制流&#xff0c;也没有某种类似于其他编程语言的方式来组织 CSS。CSS 天生缺乏逻辑性的问题导致了预处理器的出现。然而业界却对 CSS 预处理器褒贬不一&#xff0c;支持预…

JSF基于事件的交流:新派方法

在上一篇文章中 &#xff0c;我们学习了基于Observer / Event Listener和Mediator模式的基于事件的通信。 由于它们的缺点&#xff0c;我想展示基于事件的通信的更有效方法。 我们将从Google Guava EventBus开始&#xff0c;以CDI &#xff08;Java EE平台的上下文和依赖注入&a…

菜鸟之路-浅谈设计模式之单例设计模式

单例设计模式 定义&#xff1a;确保一个类仅仅有一个实例&#xff0c;并且自行实例化并向整个系统提供这个实例。单例模式是一种经常使用的软件设计模式。在它的核心结构中仅仅包括一个被称为单例的特殊类。通过单例模式能够保证系统中一个类仅仅有一个实例并且该实例易于外界訪…

python 32bit数据结构_python实现bitmap数据结构详解

bitmap是很常见的算法设计&#xff0c;例如用以Bloom Filter中&#xff1b;用以无反复整数金额的排列这些。bitmap一般根据数组来完成&#xff0c;数组中每一个原素能够当做是一系列二进制数&#xff0c;全部元素组成更高的二进制结合。针对Python而言&#xff0c;整数金额种类…

MVC如何使用开源分页插件shenniu.pager.js

最近比较忙&#xff0c;前期忙公司手机端接口项目&#xff0c;各种开发调试发布现在几乎上线无问题了&#xff1b;虽然公司项目忙不过在期间抽空做了两件个人觉得有意义的事情&#xff0c;一者使用aspnetcore开发了个人线上项目&#xff08;要说线上其实只能ip访问&#xff0c;…

四. 基于环视Camera的BEV感知算法-PETR

目录 前言0. 简述1. 算法动机&开创性思路2. 主体结构3. 损失函数4. 性能对比5. PETRv2总结下载链接参考 前言 自动驾驶之心推出的《国内首个BVE感知全栈系列学习教程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们来学习下课程第四章——基…

Java EE 6 VS Spring 3:Java EE已经杀死了Spring? 没门!

介绍 几天前&#xff0c;我在听Java Spotlight Podcast的插曲85 。 在这次演讲中&#xff0c; Bert Ertman和Paul Bakker讨论了从Spring迁移到Java EE。 基本上&#xff0c;在他们的介绍中&#xff0c;他们说&#xff0c;如今&#xff0c;选择Spring而不是Java EE是没有意义的。…

usb检测串口是哪个角_怎样测试串口和串口线是否正常

一步&#xff1a;把串口线或者USB转串口线插到计算机上。二步&#xff1a;打开串口调试助手接着选择串口&#xff0c;串口线和 USB 转串口的端口号查看路径&#xff1a;电脑上--右键--属性--硬件--设备管理器-端口(COM 和LPT),点开端口前面的号查看即可。注释&#xff1a;1、US…

NodeJS常用模块介绍

收集了NodeJS开发中常用的一些模块。MVC框架 - Express Express 是轻量灵活的Nodejs Web应用框架&#xff0c;它可以快速地搭建网站。Express框架建立在Nodejs内置的Http模块上&#xff0c;并对Http模块再包装&#xff0c;从而实际Web请求处理的 功能。它支持多种前端模板&…

Java泛型面试问题

Java面试中的通用面试问题在相当长的时间内在Java 5周围越来越普遍&#xff0c;许多应用程序都转移到Java 5上&#xff0c;并且几乎所有新的Java开发都发生在Tiger&#xff08;Java 5的代号&#xff09;上。 泛型和Java 5功能&#xff08;例如Enum&#xff09;的重要性&#xf…

隐层元素闪一下_太阳一直依靠什么元素在燃烧,地球上的重元素又是怎么来的?...

本文基于回答网友一个这样的问题&#xff1a;太阳目前氢核聚变是氦碳氧稳定燃烧地球上的铁镍重元素哪里来的&#xff1f;可以说&#xff0c;这是一个毫无逻辑乱七八糟的问题&#xff0c;但既然邀请回答&#xff0c;就从中挑出几个稍显合理的问题说明一下。太阳核心每时每刻都在…

基于Token的WEB后台认证机制

基于Token的WEB后台认证机制 几种常用的认证机制 HTTP Basic Auth HTTP Basic Auth简单点说明就是每次请求API时都提供用户的username和password&#xff0c;简言之&#xff0c;Basic Auth是配合RESTful API 使用的最简单的认证方式&#xff0c;只需提供用户名密码即可&#xf…

JSF基于事件的沟通:过时的方法

用JSF编写的Web应用程序由相互交互的bean组成。 在开发Web应用程序时&#xff0c;bean之间的通信是主要的设计模式之一。 有时&#xff0c;一个bean需要向其他bean发送事件&#xff0c;以通知它们某些更改或其他任何更改。 我们通常可以将托管bean或Spring bean注入另一个bean的…

mysql调优 基础

MySQL调优可以从几个方面来做&#xff1a;1. 架构层&#xff1a;做从库&#xff0c;实现读写分离&#xff1b;2.系统层次&#xff1a;增加内存&#xff1b;给磁盘做raid0或者raid5以增加磁盘的读写速度&#xff1b;可以重新挂载磁盘&#xff0c;并加上noatime参数&#xff0c;这…

saltstack

第一&#xff1a;安装前准备&#xff1a; 声明我用的是ubuntu 16.04的系统 1.修改主机名&#xff0c;并保证两台机器可以互相ping同主机名 ip1 master_hostname ip2 slave_hostname 第二&#xff1a;安装 服务器安装 yum install salt-master -y客户端安装 yum install salt…

ios 百度地图指定区域_获取百度地图可视区域范围的数据

有个业务场景&#xff0c;需要根据获取到的地图区域显示&#xff0c;根据相应的经纬度反查 左侧区域的会议室。思路&#xff1a;1.得到百度地图可视区域--可视区域的中心点2.可视区域的四个角的其中两个(东北角西南角)http://lbsyun.baidu.com/cms/jsapi/reference/jsapi_refer…

使用WS-Trust / STS采样器扩展JMeter

JMeter没有对WS-Security或WS-Trust的任何内置支持&#xff0c;这使我为JMeter开发了此STS Sampler –可以在负载测试STS时使任何人的生活变得更好。 首先&#xff0c;您需要拥有Apache JMeter发行版。 我正在使用v2.7。 然后&#xff0c;您可以从此处下载sts.sampler.zip –解…