# java **Repository Path**: codepilipala/java ## Basic Information - **Project Name**: java - **Description**: java编程式接口等其他特性以及mock测试用例 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-09-13 - **Last Updated**: 2024-09-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #### 一、jdk8 default 默认实现 由于有jdk8这个默认实现,全部都发生了程序的二义性。 1. 接口与类之间的多实现(不同接口定义了同样的方法名并且被默认实现),java采用类优先法则进行处理,并提供了访问接口的默认方法的语法。 2. 接口与接口之间的多继承(不同接口定义了同样的方法名并且被默认实现),产生的二义性没有c++那么复杂,只是要求发生二义性的接口必须要要解决默认方法的冲突,也就是对于发生二义性的接口在被接口实现。 ```java public class AAAA implements NN,PP { @Override public void show() { //如果不显式调用指定接口实现,会使用类优先法则,只是会调用这个实现。 //todo ... //调用nn默认实现 NN.super.show(); //调用pp默认实现 PP.super.show(); } @Override public void showP() { } @Override public void showN() { } } interface NN{ default void show(){ System.out.println("show NN"); }; void showN(); } interface PP{ default void show(){ System.out.println("show PP"); }; void showP(); } ``` ```java public interface AAAAA extends NN,PP { @Override default void show() { NN.super.show(); } } ``` #### 二、测试注解 ### Spring 常用测试 1. @SpringBootTest(classes = Application.class) 指定要测试的spring boot应用程序 2. @RunWith(SpringRunner.class) Springboot测试模块提供的注解 ```text 因为他设计到Spring bean注入Spring的生命周期管理,相当于直接把Spring服务拉起来测试的。 ``` #### MockMvc轻量级Web应用测试 1. @AutoConfigureMockMvc Springboot测试模块提供的注解 ```text 自动配置MockMvc,用于测试Web应用的测试,允许http请求并验证响应。使用这个注解会自动创建一个MockMvc实例,可以用MockMvc实例模式http请求。这种方法不需要启动完整的web服务器 可以测试mvc控制器、模式http请求并验证响应、测试RESTful web服务、测试与Http请求响应相关的逻辑 ``` 2. @WebMvcTest 它只扫描@Controller,@ControllerAdvice标注的Bean,还有一些其他和Web层相关的Bean。 ```text @Autowired private MockMvc mockMvc; 使用@Autowired注入MockMvc,但没有用@AutoConfigureMockMvc注解就会报错,也不是不能用 可以使用一下的代码: private MockMvc mockMvc; @Before public void setUp() { mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); } ``` 3. @Mock @InjectMocks注解 ```java public class SomeService { private DependencyToMock dependencyToMock; public SomeService(DependencyToMock dependencyToMock) { this.dependencyToMock = dependencyToMock; } public void performAction() { //调用 DependencyToMock 的方法来执行一些操作 dependencyToMock.doSomething(); } } //以上代码中,SomeService 类依赖了 DependencyToMock 类 //以下为测试用例,DependencyToMock 类被 @Mock 注解标记,表示它是一个模拟对象。 //@InjectMocks 注解用于创建 SomeService 的实例,并将模拟的 DependencyToMock 注入到 SomeService 中。 //用意: //在测试 SomeService 的 performAction 方法时,我们就可以控制 mockDependencyToMock 的行为,并验证它是否被正确调用,而不需要关心 DependencyToMock 的实际实现细节。 // 这就是所谓的模拟依赖项,它允许我们更专注于测试 SomeService 的逻辑 public class SomeServiceTest { @Mock private DependencyToMock mockDependencyToMock; @InjectMocks private SomeService someService; @BeforeEach void setUp() { MockitoAnnotations.initMocks(this); } } ``` #### 四、Mock测试 1. 测试响应的http状态码是否为200 ,响应的json字符串里code是否为1 ```java @Test @DisplayName("checkRequest getR") public void checkRequestR() throws Exception { MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders .get("/getR")) //验证响应是否为http 200 .andExpect(status().isOk()) //验证响应的json中code是否为1,否则测试运行会提示错误 .andExpect(jsonPath("$.code").value(1)) .andReturn(); System.out.println(mvcResult.getResponse().getContentAsString()); } ``` 2. 测试响应的字符串是否和指定的字符串一致 ```java @Test @DisplayName("checkRequest hello2") public void checkRequestHello2() throws Exception { MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders .get("/hello2") .param("name","张三")) //验证响应是否为http 200 .andExpect(status().isOk()) //验证响应的string,是否为Hello 张三1,否则测试运行提示错误 .andExpect(content().string(containsString("Hello 张三1"))) .andReturn(); System.out.println(mvcResult.getResponse().getContentAsString()); } ```