北京专业企业网站建设,今天建设银行网站无法登录,沈阳seo推广,wordpress widget hook在本系列中#xff0c;我们已经学习了建立基本的Spring MVC应用程序并学习了如何在Spring MVC中处理表单 。 现在该讨论更多涉及的主题了。 但是#xff0c;在我们涉足更深的领域之前#xff0c;让我们先进行一些基础设置。 单元测试 我不是TDD传播者。 我在那里说了。 我从… 在本系列中我们已经学习了建立基本的Spring MVC应用程序并学习了如何在Spring MVC中处理表单 。 现在该讨论更多涉及的主题了。 但是在我们涉足更深的领域之前让我们先进行一些基础设置。 单元测试 我不是TDD传播者。 我在那里说了。 我从来没有能够编写任何软件的地方对于每段代码我都先编写了一个测试然后编写了代码。 如果您已经这样做并且被编码所雇用请告诉我。 我很想了解你。 说真的 我对TDD的意见分歧到此为止。 除了在代码之前编写测试某种程度上我根本无法动动脑筋之外我还是单元测试的大力支持者。 我坚信使用JUnit测试所有功能公共但非getter设置器方法。 我非常喜欢使用cobertura报告代码覆盖率。 我是maven的忠实拥护者它使我只需一个命令就可以将它们整合到一个漂亮HTML报告中。 我将在本系列中使用JUnit 4。 让我们添加依赖项。 档案\ pom.xml properties junit.version4.10/junit.version
/properties !-- Unit testing framework. --
dependency groupIdjunit/groupId artifactIdjunit/artifactId version${junit.version}/versionscopetest/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 version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlns:phttp://www.springframework.org/schema/pxmlns:contexthttp://www.springframework.org/schema/contextxsi:schemaLocationhttp://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.xsdbean idhelloWorld classorg.academy.HelloWorldproperty namemessage valueHello world, from Spring. //bean
/beans 我可以通过多种方式将此配置文件提供给单元测试。 RunWithSpringJUnit4ClassRunner.class是很不错的添加但不是必需的 。 我在这里提供的只是在大多数情况下都可以使用的香草方法但我鼓励观众进行试验。 单元测试范围/代码范围。 对于个人/开发人员和技术主管而言我认为关于自动/半自动/简便的代码覆盖率报告的重要性还没有足够的评论。 除非您虔诚地实践TDD以我之前从未提到过的方式进行过实践否则即使是单个开发人员也绝对不可能知道单元测试是否涵盖了代码的所有逻辑分支。 我什至不打算谈论团队/组织的技术负责人如何确保其产品经过充分的单元测试。 我个人认为任何未经足够的单元测试和报告测试范围的软件产品都是无法接受的风险。 期。 诚然有一点硬性立场但事实就是如此。 我对强硬立场的坚定信念来自这样一个事实即报告测试覆盖率是如此容易。 在此示例中我将使用cobertura。 您需要将cobertua添加到Maven pom。 档案pom.xml !-- Reporting --
plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-site-plugin/artifactId version3.0/version configuration reportPlugins !-- Reporting on success / failure of unit tests -- plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-surefire-report-plugin/artifactId version2.6/version /plugin !-- Reporting on code coverage by unit tests. -- plugin groupIdorg.codehaus.mojo/groupId artifactIdcobertura-maven-plugin/artifactId version2.5.1/version configuration formats formatxml/format formathtml/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 groupIdch.qos.logback/groupId artifactIdlogback-classic/artifactIdversion${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 groupIdorg.springframework/groupId artifactIdspring-test/artifactId version${org.springframework.version}/versionscopetest/scope exclusions exclusion groupIdcommons-logging/groupId artifactIdcommons-logging/artifactId /exclusion /exclusions
/dependency 提供用于注销的配置。 文件/src/main/resources/logback.xml ?xml version1.0 encodingUTF-8?
configurationappender nameCONSOLE classch.qos.logback.core.ConsoleAppenderencoderpattern%d %5p | %t | %-55logger{55} | %m %n/pattern/encoder/appenderlogger nameorg.springframeworklevel valueINFO //loggerrootlevel valueDEBUG /appender-ref refCONSOLE //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的 参考资料 JUnitLogbackMaven和Spring 3 。 翻译自: https://www.javacodegeeks.com/2012/07/junit-logback-maven-with-spring-3.html