2024年Java最全Spring Boot web项目的TDD流程,spring运行原理面试题

读者福利

由于篇幅过长,就不展示所有面试题了,感兴趣的小伙伴

35K成功入职:蚂蚁金服面试Java后端经历!「含面试题+答案」

35K成功入职:蚂蚁金服面试Java后端经历!「含面试题+答案」

35K成功入职:蚂蚁金服面试Java后端经历!「含面试题+答案」

更多笔记分享

35K成功入职:蚂蚁金服面试Java后端经历!「含面试题+答案」

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  1. JDK8+

  2. Spring Boot 2.1+

  3. maven or Gradle

  4. JPA

  5. JUnit 5+

  6. Mockito

  7. Hamcrest

一个常见的RESTful请求处理的MVC架构:

  1. 用户访问http url

  2. 通过Controller层接口

  3. Controller层调用Service的实现

  4. Service接口通过Repsoitory层访问数据库,并最终返回数据给用户

2 构建Spring Boot工程

=================

构建一个Spring Boot Maven工程,并添加所需的依赖

参考依赖如下

<java.version>1.8</java.version>

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

<spring-boot.version>2.3.7.RELEASE</spring-boot.version>

org.springframework.boot

spring-boot-starter-data-jpa

org.springframework.boot

spring-boot-starter-web

com.h2database

h2

runtime

org.springframework.boot

spring-boot-starter-test

test

org.junit.vintage

junit-vintage-engine

org.springframework.boot

spring-boot-dependencies

${spring-boot.version}

pom

import

3 开始编写测试和代码

===========

1 Controller

============

首先编写测试Controller层的测试,test代码区创建一个测试类,SimpleControllerTest

添加两个注解 @ExtendWith和@WebMvcTest。

然后添加一个MockMvc对象,用来模拟mvc的请求。单元测试中,每个模块应当独立的测试,实际调用链中,Controller依赖Service层,因为当前测的是Controller层,对于Service层的代码则进行mock,这可以使用一个注解

@MockBean

整个代码如下

@ExtendWith({SpringExtension.class})

@WebMvcTest

public class SimpleControllerTest {

@Autowired

MockMvc mockMvc;

@MockBean

private SimpleService simpleService;

}

SimpleService不存在,编译不通过,红灯,则创建它。

如是创建一个SimpleService作为Service层的Spring bean。

@Service

public class SimpleService {

}

然后编写请求/simples http请求的测试代码

@Test

void testFindAllSimples() throws Exception {

List simpleList = new ArrayList<>();

simpleList.add(new Simple(1L,“one”));

simpleList.add(new Simple(2L,“two”));

when(simpleService.findAll()).thenReturn(simpleList);

mockMvc.perform(MockMvcRequestBuilders.get(“/simples”)

.contentType(MediaType.APPLICATION_JSON)).andExpect(jsonPath(“$”, hasSize(2))).andDo(print());

}

when then结构来自Mockito框架,when表示了执行的条件,then用于执行验证,这里的操作对simpleService.findAll方法结果进行了mock,这里 在这一层不需关心的simpleService的真实实现。后面perform方法 mock了 /simples的请求。

这里报错,红灯,接下来编写Simple类的实现。

@Entity

public class Simple {

private Long id;

private String desc;

public Simple(String desc) {

this.desc = desc;

}

}

因为simpleService.findAll方法未定义,所以还是报错的,红灯。接下来保持简单,给SimpleService创建一个findAll方法。

public List findAll() {

return new ArrayList<>();

}

编译问题都解决了,下面开始运行测试代码。

报错,

java.lang.AssertionError: No value at JSON path “$”

还是红灯,这是因为我们mock的perform 没有存在。接下来创建一个SimpleController类作为RestController,并编写/simples请求的接口。

@RestController

public class SimpleController {

@Autowired

private SimpleService simpleService;

@GetMapping(“/simples”)

public ResponseEntity<List> getAllSimples() {

return new ResponseEntity<>(simpleService.findAll(), HttpStatus.OK);

}

}

再次运行测试用例,测试都通过了,绿灯。

2 Service

=========

接下来让我们关注Service层的代码测试,test代码区创建一个SimpleServiceTest类。该类对下一层Repository依赖,同样的,创建一个Repository的mock对象。

@SpringBootTest

public class SimpleServiceTest {

@MockBean

private SimpleRepository simpleRepository;

}

编译报错,红灯,需要创建一个SimpleRepository。

@Repository

public interface SimpleRepository extends JpaRepository<Simple,Long> {

}

以上,创建SimpleRepository作为实体Simple类对象的JPA存储服务。

编写测试代码

@Test

void testFindAll() {

Simple simple = new Simple(“one”);

simpleRepository.save(simple);

SimpleService simpleService = new SimpleService(simpleRepository);

List simples = simpleService.findAll();

Simple entity = simples.get(simples.size() - 1);

assertEquals(simple.getDesc(),entity.getDesc());

assertEquals(simple.getId(),entity.getId());

}

继续解决编译报错的问题,SimpleService没有构造方法。添加Repository 并注入bean。

@Service

public class SimpleService {

private SimpleRepository simpleRepository;

public SimpleService(SimpleRepository simpleRepository) {

最后希望可以帮助到大家!

千千万万要记得:多刷题!!多刷题!!

之前算法是我的硬伤,后面硬啃了好长一段时间才补回来,算法才是程序员的灵魂!!!!

篇幅有限,以下只能截图分享部分的资源!!

(1)多线程(这里以多线程为代表,其实整理了一本JAVA核心架构笔记集)

image

(2)刷的算法题(还有左神的算法笔记)

image

(3)面经+真题解析+对应的相关笔记(很全面)

image

(4)视频学习(部分)

ps:当你觉得学不进或者累了的时候,视频是个不错的选择

在这里,最后只一句话:祝大家offer拿到手软!!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

是程序员的灵魂!!!!

篇幅有限,以下只能截图分享部分的资源!!

(1)多线程(这里以多线程为代表,其实整理了一本JAVA核心架构笔记集)

[外链图片转存中…(img-rX6xwE9v-1714869953866)]

(2)刷的算法题(还有左神的算法笔记)

[外链图片转存中…(img-D6p4gzsD-1714869953867)]

(3)面经+真题解析+对应的相关笔记(很全面)

[外链图片转存中…(img-S92V87kf-1714869953867)]

(4)视频学习(部分)

ps:当你觉得学不进或者累了的时候,视频是个不错的选择

在这里,最后只一句话:祝大家offer拿到手软!!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值