Spring MVC控制器的单元测试:配置

传统上,为Spring MVC控制器编写单元测试既简单又成问题。 尽管编写调用控制器方法的单元测试非常简单,但问题是这些单元测试不够全面。 例如,我们不能仅通过调用已测试的控制器方法来测试控制器映射,验证和异常处理。

Spring MVC Test通过使我们能够通过DispatcherServlet调用控制器方法来解决了这个问题。 这是本教程的第一部分,描述了Spring MVC控制器的单元测试,并描述了如何配置单元测试。 让我们开始吧。

使用Maven获取所需的依赖关系

我们可以通过在pom.xml文件中声明以下测试依赖项来获取所需的依赖项:

  • JUnit 4.11
  • Mockito Core 1.9.5
  • Spring测试3.2.3发布

pom.xml文件的相关部分如下所示:

<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope>
</dependency>
<dependency><groupId>org.mockito</groupId><artifactId>mockito-core</artifactId><version>1.9.5</version><scope>test</scope>
</dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>3.2.3.RELEASE</version><scope>test</scope>
</dependency>

让我们继续前进,快速看一下示例应用程序。

我们的示例应用程序剖析

本教程的示例应用程序为待办事项提供CRUD操作。 为了了解测试类的配置,我们必须对测试的控制器类有一些了解。

在这一点上,我们需要知道以下问题的答案:

  • 它有什么依赖性?
  • 如何实例化?

通过查看TodoController类的源代码,我们可以获得这些问题的答案。 TodoController类的相关部分如下所示:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.stereotype.Controller;@Controller
public class TodoController {private final TodoService service;private final MessageSource messageSource;@Autowiredpublic TodoController(MessageSource messageSource, TodoService service) {this.messageSource = messageSource;this.service = service;}//Other methods are omitted.
}

如我们所见,控制器类具有两个依赖项: TodoServiceMessageSource 。 另外,我们可以看到我们的控制器类使用构造函数注入。

至此,这就是我们需要的所有信息。 接下来,我们将讨论我们的应用程序上下文配置。

配置应用程序上下文

为我们的应用程序和测试维护单独的应用程序上下文配置很麻烦。 同样,如果我们在应用程序的应用程序上下文配置中进行了某些更改,但是忘记对测试上下文进行相同的更改,则会导致问题。

这就是为什么对示例应用程序的应用程序上下文配置进行划分的原因,我们可以在测试中重用部分应用程序。

我们的应用程序上下文配置划分如下:

  • 第一个应用程序配置类称为ExampleApplicationContext ,它是我们应用程序的“主要”配置类。
  • 第二个配置类负责配置应用程序的Web层。 此类的名称是WebAppContext ,它是我们在测试中将使用的配置类。
  • 第三个配置类称为PersistenceContext ,它包含应用程序的持久性配置。

注意:示例应用程序还具有使用XML配置文件的有效应用程序上下文配置。 与Java配置类相对应的XML配置文件为: exampleApplicationContext.xml ,exampleApplicationContext-web.xml和exampleApplicationContext-persistence.xml

让我们看一下Web层的应用程序上下文配置,并了解如何配置测试上下文。

配置Web层

Web层的应用程序上下文配置具有以下职责:

  1. 它启用了注释驱动的Spring MVC。
  2. 它配置静态资源(例如CSS文件和Javascript文件)的位置。
  3. 它确保静态资源由容器的默认Servlet提供。
  4. 它确保在组件扫描期间找到控制器类。
  5. 它配置ExceptionResolver bean。
  6. 它配置ViewResolver bean。

让我们继续看一下Java配置类和XML配置文件。

Java配置

如果使用Java配置,则WebAppContext类的源代码如下所示:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.handler.SimpleMappingExceptionResolver;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;import java.util.Properties;@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"net.petrikainulainen.spring.testmvc.common.controller","net.petrikainulainen.spring.testmvc.todo.controller"
})
public class WebAppContext extends WebMvcConfigurerAdapter {@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/static/**").addResourceLocations("/static/");}@Overridepublic void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {configurer.enable();}@Beanpublic SimpleMappingExceptionResolver exceptionResolver() {SimpleMappingExceptionResolver exceptionResolver = new SimpleMappingExceptionResolver();Properties exceptionMappings = new Properties();exceptionMappings.
put("net.petrikainulainen.spring.testmvc.todo.exception.TodoNotFoundException", "error/404");exceptionMappings.put("java.lang.Exception", "error/error");exceptionMappings.put("java.lang.RuntimeException", "error/error");exceptionResolver.setExceptionMappings(exceptionMappings);Properties statusCodes = new Properties();statusCodes.put("error/404", "404");statusCodes.put("error/error", "500");exceptionResolver.setStatusCodes(statusCodes);return exceptionResolver;}@Beanpublic ViewResolver viewResolver() {InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();viewResolver.setViewClass(JstlView.class);viewResolver.setPrefix("/WEB-INF/jsp/");viewResolver.setSuffix(".jsp");return viewResolver;}
}

XML配置

如果使用XML配置, exampleApplicationContext-web.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:mvc="http://www.springframework.org/schema/mvc"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd"><mvc:annotation-driven/><mvc:resources mapping="/static/**" location="/static/"/><mvc:default-servlet-handler/><context:component-scan base-package="net.petrikainulainen.spring.testmvc.common.controller"/><context:component-scan base-package="net.petrikainulainen.spring.testmvc.todo.controller"/><bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"><property name="exceptionMappings"><props><prop key="net.petrikainulainen.spring.testmvc.todo.exception.TodoNotFoundException">error/404</prop><prop key="java.lang.Exception">error/error</prop><prop key="java.lang.RuntimeException">error/error</prop></props></property><property name="statusCodes"><props><prop key="error/404">404</prop><prop key="error/error">500</prop></props></property></bean><bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/jsp/"/><property name="suffix" value=".jsp"/><property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/></bean>
</beans>

配置测试上下文

我们的测试上下文的配置有两个职责:

  1. 它配置一个MessageSource bean,供我们的控制器类(反馈消息)和Spring MVC(验证错误消息)使用。 我们之所以需要这样做,是因为MessageSource bean是在应用程序上下文配置的“主”配置类(或文件)中配置的。
  2. 它创建一个TodoService模拟,该模拟被注入到我们的控制器类中。

让我们了解如何使用Java配置类和XML配置文件配置测试上下文。

Java配置

如果我们通过使用Java配置来配置测试上下文,则TestContext类的源代码如下所示:

import org.mockito.Mockito;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ResourceBundleMessageSource;@Configuration
public class TestContext {@Beanpublic MessageSource messageSource() {ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();messageSource.setBasename("i18n/messages");messageSource.setUseCodeAsDefaultMessage(true);return messageSource;}@Beanpublic TodoService todoService() {return Mockito.mock(TodoService.class);}
}

XML配置

如果我们使用XML配置来配置测试上下文,那么testContext.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"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"><property name="basename" value="i18n/messages"/><property name="useCodeAsDefaultMessage" value="true"/></bean><bean id="todoService" name="todoService" class="org.mockito.Mockito" factory-method="mock"><constructor-arg value="net.petrikainulainen.spring.testmvc.todo.service.TodoService"/></bean>
</beans>

配置测试类别

我们可以使用以下选项之一配置测试类:

  1. Standalone配置允许我们注册一个或多个控制器(使用@Controller注释注释的类)并以编程方式配置Spring MVC基础结构。 如果我们的Spring MVC配置简单明了,那么这种方法是可行的选择。
  2. 基于WebApplicationContext的配置允许我们使用完全初始化的WebApplicationContext来配置Spring MVC基础结构 如果我们的Spring MVC配置太复杂以至于使用独立配置没有任何意义,那么这种方法会更好。

让我们继续前进,找出如何使用这两个配置选项来配置测试类。

使用独立配置

我们可以按照以下步骤配置测试类:

  1. 使用@RunWith注释为类添加注释,并确保使用MockitoJUnitRunner执行测试。
  2. MockMvc字段添加到测试类。
  3. TodoService字段添加到测试类,并使用@Mock注释对字段进行注释。 此注释将字段标记为模拟。 该字段由MockitoJUnitRunner初始化。
  4. 向该类添加一个私有的exceptionResolver()方法。 此方法创建一个新的SimpleMappingExceptionResolver对象,对其进行配置,然后返回创建的对象。
  5. 将私有messageSource()方法添加到该类。 此方法创建一个新的ResourceBundleMessageSource对象,对其进行配置,然后返回创建的对象。
  6. 向该类添加一个私有的validator()方法。 此方法创建一个新的LocalValidatorFactoryBean对象并返回创建的对象。
  7. 向该类添加一个专用的viewResolver()方法。 此方法创建一个新的InternalResourceViewResolver对象,对其进行配置,然后返回创建的对象。
  8. setUp()方法添加到测试类,并使用@Before注释对方法进行注释。 这样可以确保在每次测试之前都调用该方法。 该方法通过调用MockMvcBuilders类的standaloneSetup()方法创建一个新的MockMvc对象,并以编程方式配置Spring MVC基础结构。

我们的测试类的源代码如下所示:

import org.junit.Before;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.springframework.context.MessageSource;
import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.handler.SimpleMappingExceptionResolver;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;import java.util.Properties;@RunWith(MockitoJUnitRunner.class)
public class StandaloneTodoControllerTest {private MockMvc mockMvc;@Mockprivate TodoService todoServiceMock;@Beforepublic void setUp() {mockMvc = MockMvcBuilders.standaloneSetup(new TodoController(messageSource(), todoServiceMock)).setHandlerExceptionResolvers(exceptionResolver()).setValidator(validator()).setViewResolvers(viewResolver()).build();}private HandlerExceptionResolver exceptionResolver() {SimpleMappingExceptionResolver exceptionResolver = new SimpleMappingExceptionResolver();Properties exceptionMappings = new Properties();exceptionMappings.
put("net.petrikainulainen.spring.testmvc.todo.exception.TodoNotFoundException", "error/404");exceptionMappings.put("java.lang.Exception", "error/error");exceptionMappings.put("java.lang.RuntimeException", "error/error");exceptionResolver.setExceptionMappings(exceptionMappings);Properties statusCodes = new Properties();statusCodes.put("error/404", "404");statusCodes.put("error/error", "500");exceptionResolver.setStatusCodes(statusCodes);return exceptionResolver;}private MessageSource messageSource() {ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();messageSource.setBasename("i18n/messages");messageSource.setUseCodeAsDefaultMessage(true);return messageSource;}private LocalValidatorFactoryBean validator() {return new LocalValidatorFactoryBean();}private ViewResolver viewResolver() {InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();viewResolver.setViewClass(JstlView.class);viewResolver.setPrefix("/WEB-INF/jsp/");viewResolver.setSuffix(".jsp");return viewResolver;}
}

使用独立配置有两个问题:

  1. 即使我们的Spring MVC配置非常简单,我们的测试类看起来还是一团糟。 当然,我们可以通过将Spring MVC基础结构组件的创建移到一个单独的类中来清理它。 这留给读者练习。
  2. 我们必须复制Spring MVC基础结构组件的配置。 这意味着,如果我们更改应用程序的应用程序上下文配置中的某些内容,则必须记住也要对测试进行相同的更改。

使用基于WebApplicationContext的配置

我们可以按照以下步骤配置测试类:

  1. 使用@RunWith注释对测试类进行注释,并确保通过使用SpringJUnit4ClassRunner执行测试。
  2. @ContextConfiguration注释为该类添加注释,并确保使用正确的配置类(或XML配置文件)。 如果要使用Java配置,则必须将配置类设置为classes属性的值。 另一方面,如果我们更喜欢XML配置,则必须将配置文件设置为locations属性的值。
  3. @WebAppConfiguration批注对类进行批注。 此批注确保为我们的测试加载的应用程序上下文是WebApplicationContext
  4. MockMvc字段添加到测试类。
  5. TodoService字段添加到测试类,并使用@Autowired批注对该字段进行批注。
  6. WebApplicationContext字段添加到测试类,并使用@Autowired批注对该字段进行批注。
  7. setUp()方法添加到测试类,并使用@Before注释对方法进行注释。 这样可以确保在每次测试之前都调用该方法。 此方法负责:在每次测试之前重置服务模拟,并通过调用MockMvcBuilders类的webAppContextSetup()方法来创建新的MockMvc对象。

我们的测试类的源代码如下所示:

import org.junit.Before;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {TestContext.class, WebAppContext.class})
//@ContextConfiguration(locations = {"classpath:testContext.xml", "classpath:exampleApplicationContext-web.xml"})
@WebAppConfiguration
public class WebApplicationContextTodoControllerTest {private MockMvc mockMvc;@Autowiredprivate TodoService todoServiceMock;@Autowiredprivate WebApplicationContext webApplicationContext;@Beforepublic void setUp() {//We have to reset our mock between tests because the mock objects//are managed by the Spring container. If we would not reset them,//stubbing and verified behavior would "leak" from one test to another.Mockito.reset(todoServiceMock);mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();}
}

我们的测试类的配置看起来比使用独立配置的配置干净得多。 但是,“缺点”是我们的测试使用了完整的Spring MVC基础架构。 如果我们的测试类仅实际使用一些组件,则这可能是过大的杀伤力。

摘要

现在,我们已经使用独立安装程序和基于WebApplicationContext的安装程序配置了单元测试类。 这篇博客文章教会了我们两件事:

  • 我们了解到,划分应用程序上下文配置很重要,这样我们才能在测试中重用部分内容。
  • 我们了解了独立配置和基于WebApplicationContext的配置之间的区别。

本教程的下一部分描述了如何为“常规” Spring MVC控制器编写单元测试。

PS此博客文章的示例应用程序可在Github上获得 。

参考: Spring MVC控制器的单元测试: Petri Kainulainen博客上来自我们JCG合作伙伴 Petri Kainulainen的配置 。

翻译自: https://www.javacodegeeks.com/2013/07/unit-testing-of-spring-mvc-controllers-configuration-2.html

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

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

相关文章

css实现鼠标覆盖显示大图

html <div <a href”#”> <img src”img01.jpg”> <img src”img02.jpg”> </a> </div> css img{border:none;} .pic{position:relative;top:10px;left:10px} .pic a .large{position:absolute;height:0;width:0;} .pic a:hover{di…

前端js编码

1、首先是encodeURI和encodeURIComponent&#xff1b; 从名字可以清晰的看出他两都是主要用于url编码的&#xff0c;那之间有什么区别呢&#xff1f;唯一区别就是编码的字符范围&#xff0c;其中 encodeURI方法不会对下列字符编码 ASCII字母、数字、~!#$&*():/,;?&#x…

common lisp的几个基本概念

S-表达式 quote nil 与 () cons car cdr 真假 predicate 谓词与 t 与 nil null 函数 与 not 函数 if then else and 与 or defun recursion 递归 谓词 eql 与 equal format 与 read&#xff1a;format 在函数体内调用不会输出 nil&#xff08;format 函数本身有返回值为 nil) l…

python循环结束执行后面代码_计算机程序中某种代码的反复执行,称为________。Python中的循环有重复一定次数的________,也有重复到某种情况结束的________。...

3.(2019高一下浙江期末)数制转换。将一个K进制(k<10)数x转换成十进制数可采用如下方法&#xff1a;主要方法是从右向左&#xff0c;依次取数x的各位数字&#xff0c;分别计算出该数从右边数起的第i位数字与k(i-1)的积&#xff0c;再将其累加&#xff0c;直到所有的数字取完为…

计算机流体力学软件基础及工程应用,流体力学及其工程应用(英文版·原书第10版)2013年版...

流体力学及其工程应用(英文版原书第10版)出版时间&#xff1a;2013年版内容简介《流体力学及其工程应用(英文版原书第10版)/时代教育国外高校优秀教材精选》继承并发扬了前9版讲述流体力学物理现象的传统&#xff0c;并以最简单而且尽可能是最清晰&#xff0c;但又不使用复杂数…

Spring MVC测试框架入门–第2部分

这个迷你系列的第一个博客介绍了Spring MVC测试框架&#xff0c;并展示了其在单元测试Spring MVC Controller类中作为控制器而不是POJO进行单元测试的用途。 现在是时候讨论使用框架进行集成测试了。 “集成测试”是指将Spring上下文加载到测试环境中&#xff0c;以便控制器可…

jira java接口生成问题

参考页面: 可方便扩展的JIRA Rest Web API的封装调用 JIRA是一个缺陷跟踪管理系统&#xff0c;被广泛应用于缺陷跟踪、客户服务、需求收集、流程审批、任务跟踪、项目跟踪和敏捷管理等工作领域,当我们需要把第三方业务系统集成进来时&#xff0c;可以调用他的API。 JIRA本身的A…

pmd 使用笔记

pmd是一块开源的代码静态分析工具&#xff0c;使用java编写&#xff0c;可以自定义规则来进行自己想要的分析。pmd可以单独使用&#xff0c;也可以作为idea、eclipse的插件使用。它的规则分为xpath规则&#xff0c;和java规则。https://pmd.github.io/ pmd内部工作机制比较简单…

css用一张大图片来设置背景的技术真相

之前就知道了用一张图片来设置页面内的所有背景的技术。原理很简单&#xff0c;利用background-potision精确地定位到图片的位置。好处是减少页面 的http请求数。 老实说&#xff0c;我并不觉得这个技术有多值得推广。虽然是减少了http请求数&#xff0c;但对于99%的网站来说&…

flex 平铺布局_flex布局及各种布局的总结

Flexbox display: flex;如果也想设置内联元素为弹性盒子&#xff0c;可以使用display:inline-flex;实现三种其他布局难以达到的效果&#xff1a;在父内容里面垂直居中一个块内容。使容器的所有子项占用等量的可用宽度/高度&#xff0c;而不管有多少宽度/高度可用。使多列布局中…

计算机网络应用押韵句,现代汉语练习题

第一章导论一、填空题1、汉语做为一种语言&#xff0c;具有一切语言共有的性质。即从内部结构上说&#xff0c;它是一种音译结合的符号系统&#xff1b;从外部功能上说&#xff0c;它是人类社会重要的交际工具和思维工具。2、语言符号最重要的特点是任意性和线条性。3、“现代汉…

Python中 sys.argv[]的用法简明解释

Python中 sys.argv[]的用法简明解释 因为是看书自学的python,开始后不久就遇到了这个引入的模块函数&#xff0c;且一直在IDLE上编辑了后运行&#xff0c;试图从结果发现它的用途&#xff0c;然而结果一直都是没结果&#xff0c;也在网上查了许多&#xff0c;但发现这个问题的比…

在Apache Hadoop(多节点群集)中运行Map-Reduce作业

我们将在这里描述在多节点集群中的Apache Hadoop中运行MapReduce Job的过程。 要在多节点群集中设置Apache Hadoop &#xff0c;可以阅读设置Apache Hadoop多节点群集 。 为了进行设置&#xff0c;我们必须在每台计算机上使用以下配置Hadoop&#xff1a; 在所有节点的conf / …

写出完美CSS代码的5个重要方面

每个人都可以编写CSS代码&#xff0c;甚至你现在已经让它为你的项目工作了。我在博客中也一直与大家讨论&#xff0c;学习CSS编码与CSS技巧。但是CSS还 可以更好吗&#xff1f;开始用这5个Tips改进你的CSS吧&#xff01; 一、关于 CSS重置 首先&#xff0c;很认真的告诉你&…

文件上传漏洞及其绕过、对策、过狗

1. 文件包含上传&#xff1a; php://input属于php内置的封装协议&#xff0c;其实都主要是include&#xff08;&#xff09;函数处理不当如果有文件是以下写法&#xff0c;xxx随便&#xff1a;<?phpinclude($_GET[xxx]);?> 以上保存到test.php&#xff0c; 我们访问ht…

一维二维_更高效的一维、二维材料过渡态搜索

前言本文中&#xff0c;我们首先介绍如何使用NEB方法搜索过渡态&#xff0c;以及在NEB的结果的基础上&#xff0c;进一步提高精度优化出高精度、可验证的过渡态。本文以MoS2的一维条带(其中一个Mo原子被Co替代掺杂)为例进行演示。一般来说&#xff0c;这种反应&#xff0c;周期…

2013年测试基于Web的Spring应用程序(第1部分)

2013年测试基于Web的Spring应用程序&#xff08;第1部分&#xff09; LJCer和TDD / BDD的一位拥护者最近开始使用广受欢迎的Spring堆栈开发应用程序&#xff0c;他就如何最好地在这种情况下实施测试驱动的方法向我提出了建议。 我开始回覆一封电子邮件作为回应&#xff0c;但后…

计算机类课程嵌入式系统的特点及其应用,嵌入式系统的准确定义、特点及其重要性...

嵌入式计算机系统的出现&#xff0c;是现代计算机发展史上的里程碑事件。嵌入式系统诞生于微型计算机时代&#xff0c;与通用计算机的发展道路完全不同&#xff0c;形成了独立的单芯片的技术发展道路。由于嵌入式系统的诞生&#xff0c;现代计算机领域中出现了通用计算机与嵌入…

【Linux】cp命令

用途 cp除了复制功能之外还可以建立快捷方式 全称 cp的全称为copy 参数 -a :相当于同时指定参数pdr -d :若文件为链接文件的属性(link file),则复制链接文件属性而非档案本身 -f &#xff1a;强制的意思(force)&#xff0c;若目标档案已经存在且无法开启&#xff0c;则移除后再…

网页变成灰色,对重大事件表示哀悼

body * { -webkit-filter: grayscale(100%); -moz-filter: grayscale(100%); -ms-filter: grayscale(100%); -o-filter: grayscale(100%); filter: grayscale(100%); filter:progid:DXImageTransform.Microsoft.BasicImage(grayscale1); filter: gray; } 兼容所有浏览器&#x…