读者福利
由于篇幅过长,就不展示所有面试题了,感兴趣的小伙伴
更多笔记分享
-
JDK8+
-
Spring Boot 2.1+
-
maven or Gradle
-
JPA
-
JUnit 5+
-
Mockito
-
Hamcrest
一个常见的RESTful请求处理的MVC架构:
-
用户访问http url
-
通过Controller层接口
-
Controller层调用Service的实现
-
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核心架构笔记集)
(2)刷的算法题(还有左神的算法笔记)
(3)面经+真题解析+对应的相关笔记(很全面)
(4)视频学习(部分)
ps:当你觉得学不进或者累了的时候,视频是个不错的选择
在这里,最后只一句话:祝大家offer拿到手软!!
是程序员的灵魂!!!!
篇幅有限,以下只能截图分享部分的资源!!
(1)多线程(这里以多线程为代表,其实整理了一本JAVA核心架构笔记集)
[外链图片转存中…(img-rX6xwE9v-1714869953866)]
(2)刷的算法题(还有左神的算法笔记)
[外链图片转存中…(img-D6p4gzsD-1714869953867)]
(3)面经+真题解析+对应的相关笔记(很全面)
[外链图片转存中…(img-S92V87kf-1714869953867)]
(4)视频学习(部分)
ps:当你觉得学不进或者累了的时候,视频是个不错的选择
在这里,最后只一句话:祝大家offer拿到手软!!