eclipse下SpringBoot开发和测试

简介: SpringBoot是快速开发企业应用的一条捷径,尤其是在Spring4以后,项目完全不需要xml配置以来,让开发者感到巨大的流畅感。 我们使用Eclipse搭建一个基于maven的SpringBoot项目,不了解的可以看一下《用maven搭建springboot环境》。

SpringBoot是快速开发企业应用的一条捷径,尤其是在Spring4以后,项目完全不需要xml配置以来,让开发者感到巨大的流畅感。

我们使用Eclipse搭建一个基于maven的SpringBoot项目,不了解的可以看一下《用maven搭建springboot环境》。

 

新建maven项目,把需要的源包都建好,可以删掉web.xml文件,然后打开pom文件。这里我们的依赖要比上面文章里的多一些。

首先删除自动生成的Junit依赖,我们的单元测试虽然也是Junit,不过SpringBoot会自动添加依赖。

然后按照上面那篇文章添加parent

        <parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.2.6.RELEASE</version>
	</parent>

 这里使用的是最新的126发布版,所以不需要像文章中提到的那样增加下面的库

<!-- 使用 Spring repositories -->  
    <!-- (我们使用的是SNAPSHOT版本,如果用RELEASE版本下面的偶不用写) -->  
    <repositories>  
        <repository>  
            <id>spring-snapshots</id>  
            <url>http://repo.spring.io/snapshot</url>  
            <snapshots><enabled>true</enabled></snapshots>  
        </repository>  
        <repository>  
            <id>spring-milestones</id>  
            <url>http://repo.spring.io/milestone</url>  
        </repository>  
    </repositories>  
    <pluginRepositories>  
        <pluginRepository>  
            <id>spring-snapshots</id>  
            <url>http://repo.spring.io/snapshot</url>  
        </pluginRepository>  
        <pluginRepository>  
            <id>spring-milestones</id>  
            <url>http://repo.spring.io/milestone</url>  
        </pluginRepository>  
    </pluginRepositories> 

接下来添加我们这里需要的几个依赖

                <dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.hateoas</groupId>
			<artifactId>spring-hateoas</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-actuator</artifactId>
		</dependency>

 第一个是SpringBoot的单元测试依赖;第二个是最主要的,用来开发webapp的web依赖;第三个是SpringBoot开发Restful服务的HATEOAS依赖;第四个是管理员使用的接口依赖。

 

然后我们新建一个Model

public class Greeting extends ResourceSupport {
	private long gid;
	private String content;

	@JsonCreator
	@JsonIgnoreProperties(ignoreUnknown = true)
	public Greeting(@JsonProperty(value = "gid") long gid, @JsonProperty(value = "content") String content) {
		this.gid = gid;
		this.content = content;
	}

 这里只列出了类定义和构造器,你需要自己添加getter和setter方法。

这里的注解不是必须的,你可以都删掉。他们的作用可以自己看一下javadoc。

 

然后建一个controller

import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.methodOn;

@RestController
public class GreetingController {
	private static final String template = "Hello, %s";
	private final AtomicLong counter = new AtomicLong();

	@RequestMapping("/greeting")
	public Greeting greeting(@RequestParam(value = "name", defaultValue = "world") String name) {
		Greeting greeting = new Greeting(counter.incrementAndGet(), String.format(template, name));
		GreetingController methodOn = methodOn(GreetingController.class);
		// GreetingController methodOn = DummyInvocationUtils.methodOn(GreetingController.class);
		Greeting greeting2 = methodOn.greeting(name);
		ControllerLinkBuilder linkTo = linkTo(greeting2);
		Link withSelfRel = linkTo.withSelfRel();
		greeting.add(withSelfRel);

		return greeting;
	}
	
	@RequestMapping("/show")
	public Greeting show(){
		RestTemplate template = new RestTemplate();
		Greeting greeting = template.getForObject("http://localhost:8080/greeting?name=323", Greeting.class);
		System.err.println(greeting);
		return greeting;
	}

}

 

@restController注解表明里面的每个action都返回的不是view。

 

然后我们使用内置的Tomcat服务器部署,这个服务器的性能和你本机下载的绿色版是一样的

@SpringBootApplication
public class Application implements CommandLineRunner{
	public static void main(String[] args) {
		ConfigurableApplicationContext context =
		SpringApplication.run(Application.class, args);

		System.out.println("hohoho");
		String[] names = context.getBeanDefinitionNames();
		Arrays.sort(names);
		for (String string : names) {
		System.err.println(string);
		}
	}

	@Override
	public void run(String... args) throws Exception {
		RestTemplate template = new RestTemplate();
		Greeting greeting = template.getForObject("http://localhost:8080/greeting?name=323", Greeting.class);
		System.err.println(greeting);		
	}

}

 

接下来我们分步验收我们的成果(就算成果吧)。

首先运行main方法,在浏览器里访问http://localhost:8080/greeting,你应该能看到你想看到的;然后访问http://localhost:8080/greeting?name=WhoAmI,应该和你预料的也一样,都是返回的JSON串。每个串里都有当前的访问路径,这就是HATEAOS的作用,人们认为调用服务的时候路径拼接不对很影响开发效率就非要加上这个。

我们已经验证了web依赖和hateaos依赖工作正常,接下来看一下actuator。不知道你注意到没有,应用启动的时候输出了很多类似

Mapped "{[/greeting],methods=[GET]}" onto ...
Mapped "{[/env],methods=[GET]}" onto ...
Mapped "{[/info],methods=[GET]}" onto ...
Mapped "{[/health],methods=[GET]}" onto ...

 的东西,是程序输出的而非我们打印的。

也行看到第一行你就会明白我们可以尝试访问http://localhost:8080/env 、 http://localhost:8080/health  、 http://localhost:8080/info等路径。actuator提供了很多管理员工具,更多的可以去官网了解。

 

接下来看一下单元测试。

在我们的GreetingController上面右键-新建-JUnit Test Case,把测试类的目录改到src/test/java下面。然后修改里面的代码,因为我们用不到它默认的测试方法

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = MockServletContext.class)
@WebAppConfiguration
public class GreetingControllerTest {
	private MockMvc mvc;

	@Before
	public void setUp() {
		mvc = MockMvcBuilders.standaloneSetup(new GreetingController()).build();
	}

	@Test
	public void getHello() throws Exception {
		ResultActions actions = mvc.perform(MockMvcRequestBuilders.get("/greeting").accept(MediaType.APPLICATION_JSON));
		actions.andExpect(status().isOk());
//		actions.andExpect(content().string(equalTo("Hello world")));
	}
}

 这里面用到了几个静态导入,eclipse对静态导入的处理简直令人发指,你可以copy进去:

import static org.hamcrest.Matchers.equalTo;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

 

运行它,应该可以通过。然后把最下面一行的注释去掉,也就是增加一个新断言,认为返回的内容是Hello world。这次一定通不过了。

 

最后我们看一下主运行文件里面的那个run方法

@Override
	public void run(String... args) throws Exception {
		RestTemplate template = new RestTemplate();
		Greeting greeting = template.getForObject("http://localhost:8080/greeting?name=323", Greeting.class);
		System.err.println(greeting);		
	}

 

看到上面的复写注解就知道它来自哪里了是吧,没错,就是实现的那个接口CommandLineRunner(所以完全可以不实现)。实现了这个接口的类(需要是一个bean,不过@SpringBootApplication注解有这个功能)在成功运行后会调用这个run方法。

我们在run中把返回的json重新组装成Greeting实例。为了更清晰,你最好给Greeting类增加

@Override	public String toString()

 

这个能成功的关键是构造器的参数中使用了@JsonProperty注解,并且使用了value参数。你可以删掉试一下效果。

 

既然是web service,所以我们的最后一步就是打开CORS访问,不然异步访问不了。我不太明白为什么一个随时随地可以同步访问的地址在异步的时候非要限制。新建一个FIlter

class SimpleCORSFilter implements Filter {
	@Override
	public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
			throws IOException, ServletException {
		HttpServletResponse response = (HttpServletResponse) res;
		response.setHeader("Access-Control-Allow-Origin", "*");
		response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE");
		response.setHeader("Access-Control-Max-Age", "3600");
		response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
		chain.doFilter(req, res);
	}

 这个类实现了javax.servlet.Filter接口。既然我们没有了web.xml文件,怎么才能让它拦截请求呢?我们可以给这个类加上自动配置的注解,比如org.springframework.stereotype.Component或org.springframework.stereotype.Repository。

 

 

目录
相关文章
|
1月前
|
Java 测试技术 开发者
必学!Spring Boot 单元测试、Mock 与 TestContainer 的高效使用技巧
【10月更文挑战第18天】 在现代软件开发中,单元测试是保证代码质量的重要手段。Spring Boot提供了强大的测试支持,使得编写和运行测试变得更加简单和高效。本文将深入探讨Spring Boot的单元测试、Mock技术以及TestContainer的高效使用技巧,帮助开发者提升测试效率和代码质量。
172 2
|
1月前
|
XML Java 测试技术
【SpringBoot系列】初识Springboot并搭建测试环境
【SpringBoot系列】初识Springboot并搭建测试环境
84 0
|
1月前
|
安全 Java 数据库
shiro学习一:了解shiro,学习执行shiro的流程。使用springboot的测试模块学习shiro单应用(demo 6个)
这篇文章是关于Apache Shiro权限管理框架的详细学习指南,涵盖了Shiro的基本概念、认证与授权流程,并通过Spring Boot测试模块演示了Shiro在单应用环境下的使用,包括与IniRealm、JdbcRealm的集成以及自定义Realm的实现。
45 3
shiro学习一:了解shiro,学习执行shiro的流程。使用springboot的测试模块学习shiro单应用(demo 6个)
|
11天前
|
安全 测试技术 持续交付
云计算时代的软件开发与测试:高效、灵活、可扩展
云计算时代的软件开发与测试:高效、灵活、可扩展
|
1月前
|
人工智能 监控 测试技术
云应用开发平台测试
云应用开发平台测试
52 2
|
1月前
|
监控 Java Maven
springboot学习二:springboot 初创建 web 项目、修改banner、热部署插件、切换运行环境、springboot参数配置,打包项目并测试成功
这篇文章介绍了如何快速创建Spring Boot项目,包括项目的初始化、结构、打包部署、修改启动Banner、热部署、环境切换和参数配置等基础操作。
143 0
|
14天前
|
JSON Java 测试技术
SpringCloud2023实战之接口服务测试工具SpringBootTest
SpringBootTest同时集成了JUnit Jupiter、AssertJ、Hamcrest测试辅助库,使得更容易编写但愿测试代码。
49 3
|
1月前
|
JSON 算法 数据可视化
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
这篇文章是关于如何通过算法接口返回的目标检测结果来计算性能指标的笔记。它涵盖了任务描述、指标分析(包括TP、FP、FN、TN、精准率和召回率),接口处理,数据集处理,以及如何使用实用工具进行文件操作和数据可视化。文章还提供了一些Python代码示例,用于处理图像文件、转换数据格式以及计算目标检测的性能指标。
67 0
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
|
2月前
|
移动开发 JSON Java
Jmeter实现WebSocket协议的接口测试方法
WebSocket协议是HTML5的一种新协议,实现了浏览器与服务器之间的全双工通信。通过简单的握手动作,双方可直接传输数据。其优势包括极小的头部开销和服务器推送功能。使用JMeter进行WebSocket接口和性能测试时,需安装特定插件并配置相关参数,如服务器地址、端口号等,还可通过CSV文件实现参数化,以满足不同测试需求。
248 7
Jmeter实现WebSocket协议的接口测试方法
|
2月前
|
JSON 移动开发 监控
快速上手|HTTP 接口功能自动化测试
HTTP接口功能测试对于确保Web应用和H5应用的数据正确性至关重要。这类测试主要针对后台HTTP接口,通过构造不同参数输入值并获取JSON格式的输出结果来进行验证。HTTP协议基于TCP连接,包括请求与响应模式。请求由请求行、消息报头和请求正文组成,响应则包含状态行、消息报头及响应正文。常用的请求方法有GET、POST等,而响应状态码如2xx代表成功。测试过程使用Python语言和pycurl模块调用接口,并通过断言机制比对实际与预期结果,确保功能正确性。
257 3
快速上手|HTTP 接口功能自动化测试

推荐镜像

更多
下一篇
无影云桌面