Mockito测试框架中的方法详解

这里写目录标题

  • 第一章、模拟对象
    • 1.1)①mock()方法:
    • 1.2)②spy()方法:
  • 第二章、模拟对象行为
    • 2.1)模拟方法调用
        • ①when()方法
    • 2.2)模拟返回值
        • ②thenReturn(要返回的值)
        • ③doReturn()
    • 2.3)模拟并替换原方法的行为
        • ④thenAnswer()
        • ⑤doAnswer
    • 2.4)部分模拟时是否调用真实方法
        • ⑥thenCallRealMethod()
        • ⑦doCallRealMethod()
    • 2.5)模拟抛出异常
        • ⑧thenThrow()
        • ⑨doThrow()
    • 2.6)模拟构造函数和静态方法
        • ⑩模拟构造函数MockedConstruction
        • ⑩①模拟静态方法:MockedStatic
    • 2.7)其他方法
        • 使void方法什么也不做doNothing()
        • 重置模拟对象状态reset()方法:
  • 第三章、模拟对象行为验证
    • 3.1)验证调用次数
        • ①verify()方法:
        • ②verify(object, Mockito.times(2))方法
    • 3.2)验证是否发生交互
        • ③verifyNoMoreInteractions()方法:
        • ④verifyZeroInteractions()方法:
  • 第四章、Assert结果断言
    • 4.1)验证结果
        • ①验证是否相等:Equals
        • ②验证结果真假
        • ③验证结果是否为null
        • ④验证对象引用
        • ⑤验证是否满足指定条件
    • 4.2)使结果直接失败
        • ⑥使测试用例失败:fail()

第一章、模拟对象

1.1)①mock()方法:

用于创建给定类或接口的模拟对象,创建对象的另一种方式就是直接用@Mock/InjectMocks注解来创建模拟对象,第三章有介绍。

注意:无法mock final类和final方法,静态方法和静态对象,私有方法。

import java.util.List;
import static org.mockito.Mockito.*;public class MockitoMockMethodExample {public void testMultipleMocks() {// 使用 Mockito.mock() 方法创建多个模拟对象List<String> mockList1 = mock(List.class);List<String> mockList2 = mock(List.class);// 设置第一个模拟对象的预期行为when(mockList1.size()).thenReturn(5);// 设置第二个模拟对象的预期行为when(mockList2.size()).thenReturn(10);// 断言模拟对象的行为符合预期assert(mockList1.size() == 5);assert(mockList2.size() == 10);}
}

1.2)②spy()方法:

用于部分模拟对象,可以对真实对象的特定方法进行覆盖。它保留了真实对象的部分行为。Spy对象既可以模拟方法的返回值,也可以保留方法的实际行为。

示例中:spy() 方法创建了一个 ArrayList 对象的部分模拟,然后使用 when().thenReturn() 方法对 size() 方法进行了模拟。最后,调用部分模拟对象的真实方法时,模拟的方法返回了预期的值。

import static org.mockito.Mockito.*;// 示例:创建一个部分模拟的对象
List<String> list = new ArrayList<>();
List<String> listSpy = spy(list);// 示例:模拟部分方法
when(listSpy.size()).thenReturn(10);// 示例:调用部分模拟对象的真实方法
listSpy.add("one");
System.out.println(listSpy.size()); // 输出 10,因为 size() 方法被模拟为返回 10

第二章、模拟对象行为

2.1)模拟方法调用

①when()方法

用于指定模拟对象的方法调用,并设置相应的操作,例如返回值、异常等。
when():此方法需要一个方法调用作为参数(通常是模拟对象的一个方法)。它会记录下这个方法调用,并允许你接下来定义这个方法调用的行为。

when(service.方法名(参数))

2.2)模拟返回值

②thenReturn(要返回的值)

thenReturn(T value),这个方法需要你想要返回的值作为参数。当 when() 中指定的方法被调用时,模拟对象将返回这个值。

当使用模拟对象(用@Mock注释),选择thenReturn模拟有返回值(非void)的方法

如果使用监视对象(用@Spy注释),when(…) thenReturn(…)在返回指定值之前会进行实际方法调用。就需要处理这个方法可能抛出的异常。所以有异常的方法一般不使用thenReturn

when(service.方法名(参数)).thenReturn(要返回的值)

示例:

public class MockitoExample {@Testvoid testWhenThenReturn() {// 创建模拟对象List mockedList = Mockito.mock(List.class);// 定义当调用mockedList.get(0)时返回"first"Mockito.when(mockedList.get(0)).thenReturn("first");// 使用模拟对象System.out.println(mockedList.get(0));  // 输出 "first"System.out.println(mockedList.get(1));  // 输出 null,因为我们没有定义get(1)的行为}
}
③doReturn()

当使用模拟对象(用@Mock注释),选择thenReturn模拟无返回值(void)的方法

如果使用监视对象(用@Spy注释),doReturn(…) when(…)不会真正调用该方法。这意味着即使被调用的真实方法抛出异常,也不会影响测试。所以doReturn() 方法通常用于对部分模拟对象(spy)进行方法模。

doReturn(10).when(listSpy).size();

示例:

import static org.mockito.Mockito.*;// 示例:创建一个部分模拟的对象
List<String> list = new ArrayList<>();
List<String> listSpy = spy(list);// 示例:使用doReturn方法模拟部分方法
doReturn(10).when(listSpy).size();// 示例:调用部分模拟对象的真实方法
listSpy.add("one");
System.out.println(listSpy.size()); // 输出 10,因为 size() 方法被模拟为返回 10

2.3)模拟并替换原方法的行为

④thenAnswer()

如果在方法调用中需要固定的返回值,则应使用thenReturn()。 如果需要执行某些操作或替换原方法的行为,则应使用thenAnswer()

如下示例:在调用getCurrentTime方法时作用是获取当前的日期和时间。我想使用Instant.now().toEpochMilli();方法替换getCurrentTime方法的内部代码逻辑。

则需要先
1、实现接口org.mockito.stubbing.Answer的类的对象。
2、在方法answer(…)内部自定义行为。
3、我们从模拟对象中调用模拟方法getCurrentTime时,实际上是执行answer中的代码逻辑。

import org.junit.Test;
import org.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import java.time.Instant;public class TimeServiceTest {@Testpublic void testGetCurrentTime() {// 创建TimeService类的模拟对象TimeService timeService = Mockito.mock(TimeService.class);// 创建一个 Answer 对象,实现 answer 方法来返回当前系统时间Answer<Long> answer = new Answer<Long>() {public Long answer(InvocationOnMock invocation) throws Throwable {return Instant.now().toEpochMilli();}};// 使用 thenAnswer() 指定模拟对象的方法返回当前系统时间
Mockito.when(timeService.getCurrentTime()).thenAnswer(answer);// 调用模拟对象的方法,实际执行的是answer中的代码逻辑long currentTime = timeService.getCurrentTime();// 验证方法是否被调用Mockito.verify(timeService).getCurrentTime();// 进行进一步的断言}
}

我们可以也使用Java 8 lambda功能来实现answer方法。

public class TimeServiceTest {@Testpublic void testGetCurrentTime() {// 创建TimeService类的模拟对象TimeService timeService = Mockito.mock(TimeService.class);// 创建一个 Answer 对象,实现 answer 方法来返回当前系统时间Answer<Long> answer = new Answer<Long>() {public Long answer(InvocationOnMock invocation) throws Throwable {return Instant.now().toEpochMilli();}};// 使用 thenAnswer() 指定模拟对象的方法返回当前系统时间Mockito.when(timeService.getCurrentTime()).thenAnswer(answer);// 调用模拟对象的方法,实际执行的是answer中的代码逻辑long currentTime = timeService.getCurrentTime();// 验证方法是否被调用Mockito.verify(timeService).getCurrentTime();// 进行进一步的断言}
}
⑤doAnswer

更适用于对 void 方法进行模拟。你可以使用 doAnswer 来执行额外的操作,比如触发回调、记录日志等,因为 void 方法本身没有返回值。
创建一个 Answer 对象,实现 answer 方法来指定特定的操作或返回值,

示例中:通过Mockito的模拟,我们成功地替换了原来calculate方法的实际行为

doAnswer(answer).when(service).方法(Mockito.anyInt(), Mockito.anyInt());

示例:

// 假设有一个名为Service的类,其中包含一个方法
public class Service {public int calculate(int a, int b) {// 一些复杂的计算return a + b;}
}// 在测试中,使用Mockito来模拟Service类的行为
import org.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;public class ServiceTest {@Testpublic void testCalculate() {// 创建Service类的模拟对象Service service = Mockito.mock(Service.class);// 创建一个 Answer 对象,实现 answer 方法来指定特定的操作或返回值Answer<Integer> answer = new Answer<Integer>() {public Integer answer(InvocationOnMock invocation) throws Throwable {int a = invocation.getArgument(0);int b = invocation.getArgument(1);// 在 answer 方法中执行特定的操作或返回特定的值return a * b;}};//doAnswer表示当calculate方法被调用时,执行特定的操作   
Mockito.doAnswer(answer).when(service).calculate(Mockito.anyInt(), Mockito.anyInt());// 调用模拟对象的方法//当调用service.calculate(2, 3)时,实际执行的是2 * 3,结果为6int result = service.calculate(2, 3);// 验证方法是否被调用,并且返回了预期的值Mockito.verify(service).calculate(2, 3);assertEquals(6, result);}
}

2.4)部分模拟时是否调用真实方法

⑥thenCallRealMethod()

用于部分模拟对象(spy)时,当调用指定方法时,实际调用对象的真实方法而不是模拟方法。特别是当需要部分模拟对象并且希望某些方法执行真实逻辑时。

when(service.方法名(参数)).thenCallRealMethod()

示例:

// 假设有一个名为UserService的类
public class UserService {public String process(String input) {// 实际的方法逻辑return "Processed: " + input;}
}// 创建UserService的部分模拟对象
UserService userService = Mockito.spy(UserService.class);// 当调用process方法时,执行实际的方法逻辑
Mockito.when(userService.process("input")).thenCallRealMethod();// 调用部分模拟对象的方法
String result = userService.process("input");// 输出结果,将会是"Processed: input",因为实际的方法逻辑被执行了
System.out.println(result);
⑦doCallRealMethod()

用于部分模拟对象(spy)时,用于调用真实对象的实际方法,而不是模拟方法的行为。这在部分模拟对象(spy)中特别有用,因为它允许部分模拟对象调用其真实的方法,而不是模拟方法的行为。

doCallRealMethod().when(someObject).someMethod();

示例:

// 创建一个部分模拟对象
SomeClass someObject = mock(SomeClass.class);
doCallRealMethod().when(someObject).someMethod();// 调用真实方法
someObject.someMethod();

2.5)模拟抛出异常

⑧thenThrow()

thenThrow 适用于有出参的方法,thenThrow方法指定了在调用该方法时抛出指定的异常,而 thenThrow() 方法更适合在特定条件下抛出异常。

when(mockedList.get(0)).thenThrow(new RuntimeException())

示例:这里是RuntimeException

when(service.方法名(参数)).thenThrow(new RuntimeException());

示例:

import static org.mockito.Mockito.*;public class ExampleTest {@Testpublic void testMethod() {// 创建被mock的对象SomeClass mockObj = mock(SomeClass.class);// 设置当调用mockObj.method时抛出异常when(mockObj.method(anyString())).thenThrow(new RuntimeException("Something went wrong"));// 调用被mock的方法这里会抛出异常mockObj.method("test");}
}
⑨doThrow()

doThrow 适用于 没有出参的方法,在测试中模拟抛出异常的情况。doThrow() 方法更适合在调用特定方法时强制抛出异常

doThrow(new RuntimeException()).when(mockedList).get(0)

示例:

import static org.mockito.Mockito.*;// 创建mock对象
List<String> mockedList = mock(List.class);// 指定当调用mockedList的get()方法时抛出异常
doThrow(new RuntimeException()).when(mockedList).get(0);// 调用被测方法
mockedList.get(0); // 这里会抛出指定的异常

2.6)模拟构造函数和静态方法

⑩模拟构造函数MockedConstruction

在单元测试中,当需要在测试中模拟某个类的实例时,使用MockedConstruction可以模拟构造函数的行为,如果没有模拟构造函数,那么在使用new关键字创建对象时,会执行实际的构造函数

作用:当需要在测试中模拟第三方库的对象时,可以使用MockedConstruction来模拟构造函数,而不实际调用第三方库的构造函数,从而避免对外部资源的依赖。

import org.junit.jupiter.api.Test;
import org.mockito.MockedConstruction;
import org.mockito.Mockito;public class ExampleTest {@Testvoid testWithMockedConstruction() {//模拟构造函数行为try (MockedConstruction<MyClass> mocked = Mockito.mockConstruction(MyClass.class)) {//模拟完以后再创建对象,此时执行的就是模拟的构造函数,而不是实际的MyClass myClass = new MyClass();//调用get方法Mockito.when(myClass.getName()).thenReturn("mocked value");// 在这里使用myClass进行测试}}
}
⑩①模拟静态方法:MockedStatic

MockedStatic是Mockito框架中的一个类,用于模拟静态方法的行为。通过使用MockedStatic,您可以模拟静态方法的返回值,以及验证静态方法的调用次数。

import org.mockito.MockedStatic;
import org.mockito.Mockito;public class Example {public void exampleMethod() {//YourClassWithStaticMethod是包含静态方法的类
try (MockedStatic<YourClassWithStaticMethod> mockedStatic = Mockito.mockStatic(YourClassWithStaticMethod.class)) {mockedStatic.when(YourClassWithStaticMethod::staticMethod("param1")).thenReturn("someValue");// 调用静态方法
YourClassWithStaticMethod.staticMethod("param1");// 验证静态方法是否被调用过
mockedStatic.verify(YourClassWithStaticMethod::staticMethod("param1"));}}
}

2.7)其他方法

使void方法什么也不做doNothing()

doNothing() 方法的作用是用于设置模拟对象的 void 方法不执行任何操作。因为 mock 对象中,void 函数就是什么都不做,所以该方法更适合 spy 对象。

Mockito.doNothing().when(service).方法名(参数)

示例1:

static class ExampleClass {public void hello() {System.out.println("吃过了");}}
/
public class MockDemo {@Testpublic void test() {ExampleClass exampleClass = spy(new ExampleClass ());ExampleClass .hello();  //打印吃过了// 通过doNothein让方法什么都不做doNothing().when(exampleClass ).hello();exampleClass.hello(); // 什么都不输出}
}

示例2:这是复制的国外一个博主的代码

List list = new LinkedList(); 
List spy = spy(list); 
//let's make clear() do nothing 
doNothing().when(spy).clear(); 
spy.add("one"); 
//clear() does nothing, so the list still contains "one" 
spy.clear();
重置模拟对象状态reset()方法:

用于重置模拟对象的状态或者将对象恢复到初始状态

import org.junit.Test;
import org.mockito.Mockito;// 创建一个模拟对象
List<String> mockedList = Mockito.mock(List.class);// 对模拟对象进行方法调用
mockedList.add("one");
System.out.println(mockedList.size()); // 输出 1// 重置模拟对象的状态
Mockito.reset(mockedList);// 再次对模拟对象进行方法调用
System.out.println(mockedList.size()); // 输出 0,因为模拟对象的状态已被重置

第三章、模拟对象行为验证

3.1)验证调用次数

①verify()方法:

用于验证模拟对象的指定方法是否被调用。可以进一步验证方法的调用次数和参数。

import org.junit.jupiter.api.Test;
import org.mockito.Mockito;import java.util.List;public class MockitoExample {@Testvoid testMock() {// 创建模拟对象List mockedList = Mockito.mock(List.class);// 使用模拟对象mockedList.add("one");Mockito.verify(mockedList).add("one");// 验证模拟对象的某些行为是否发生过Mockito.verify(mockedList, Mockito.times(1)).add("one");}
}
②verify(object, Mockito.times(2))方法

是一个 Mockito 框架中的验证方法,用于验证某个行为在模拟对象上被调用了几次。times() 方法需要一个整数参数,代表你期望的调用次数。然后,将返回一个 VerificationMode 实例,这个实例可以和 verify() 方法一起使用,来检查某个操作是否被执行了指定次数。

下述代码;Mockito.times(2) 指的是,我们期望 add() 方法在模拟对象 mockedList 上被调用了两次。如果 add() 方法的实际调用次数不匹配我们的期望(例如,它只被调用了一次,或者三次),那么代码会抛出一个 MockitoAssertionError 异常。

public class MockitoExample {@Testvoid testTimes() {// 创建模拟对象List mockedList = Mockito.mock(List.class);// 模拟方法调用mockedList.add("one");mockedList.add("one");// 验证该方法是否被调用了两次Mockito.verify(mockedList, Mockito.times(2)).add("one");}
}

下述代码:不会抛出异常因为add了两次,与预期相符

import java.util.List;
import static org.mockito.Mockito.*;public class MockitoTimesExample {public void testMethodInvocation() {// 创建模拟对象List<String> mockList = mock(List.class);// 调用模拟对象的方法mockList.add("item1");mockList.add("item2");// 验证方法调用次数verify(mockList, times(2)).add(anyString());}
}

3.2)验证是否发生交互

③verifyNoMoreInteractions()方法:

verifyNoMoreInteractions() 方法用于验证mock对象在特定交互之后是否没有发生任何其他交互。它确保在测试中,mock对象在预期的交互之后没有进行多余交互。

多余交互指的是对于被mock的对象,测试代码中发生了未被预期的方法调用。这可能是因为测试代码中的某些逻辑导致了额外的方法调用。

import org.junit.Test;
import org.mockito.Mockito;public class ProcessorTest {@Testpublic void processTest() {// 创建 MyService 的 mock 对象MyService myMockService = Mockito.mock(MyService.class);// 创建 MyProcessor 对象,并传入 mock 对象MyProcessor myProcessor = new MyProcessor(myMockService);// 调用 MyProcessor 的 process() 和 process2() 方法myProcessor.process();myProcessor.process2();// 验证 mock 对象的交互Mockito.verify(myMockService).doSomething();Mockito.verify(myMockService).doSomething2();// 确保没有更多的交互发生Mockito.verifyNoMoreInteractions(myMockService);}
}
④verifyZeroInteractions()方法:

用于验证模拟对象上是否没有发生任何交互。它确保在测试中,mock对象没有与任何其他对象进行交互。关注的是整个测试过程中是否有任何交互。

import static org.mockito.Mockito.*;// 创建mock对象
List<String> mockedList = mock(List.class);// 调用被测方法
mockedList.clear();// 验证是否发生了交互
verify(mockedList).clear();
verifyNoMoreInteractions(mockedList); // 确保没有其他交互

第四章、Assert结果断言

4.1)验证结果

①验证是否相等:Equals

assertEquals(expected, actual):验证两个对象是否相等。
assertNotEquals(unexpected, actual):验证两个对象是否不相等。

示例:验证 Calculator.add(3, 5) 的结果是否等于 8。如果不相等,测试用例将会失败,并输出指定的失败信息。

import static org.junit.jupiter.api.Assertions.assertEquals;@Test
void testAddition() {int result = Calculator.add(3, 5);assertEquals(8, result, "The addition result should be 8");
}

assertArrayEquals(expectedArray, resultArray):验证两个数组是否相等。
assertArrayEquals(expecteds, actuals, delta):验证两个浮点数数组是否相等,可以指定误差范围。

示例:验证 expectedArray 和 resultArray 是否相等。如果两个数组不相等,测试用例将会失败,并输出指定的失败信息。

import static org.junit.jupiter.api.Assertions.assertArrayEquals;@Test
void testArrayEquality() {int[] expectedArray = {1, 2, 3};int[] resultArray = {1, 2, 3};assertArrayEquals(expectedArray, resultArray, "The arrays should be equal");
}
②验证结果真假

assertTrue(): 期待结果为true
assertFalse(): 期待结果为false

示例:验证 number 是否大于 0。如果条件不满足,测试用例将会失败,并输出指定的失败信息。

import static org.junit.jupiter.api.Assertions.assertTrue;@Test
void testIsPositive() {int number = 10;assertTrue(number > 0, "The number should be positive");
}
③验证结果是否为null

assertNull(object):期待结果为空。
assertNotNull(object): 期待结果为非空

示例:验证 obj 是否为空。如果对象不为空,测试用例将会失败,并输出指定的失败信息。

import static org.junit.jupiter.api.Assertions.assertNull;@Test
void testObjectNull() {Object obj = null;assertNull(obj, "对象应为空");
}
④验证对象引用

assertSame(object1, object2):验证两个对象引用是否指向同一个对象。
assertNotSame(object1, object2):验证两个对象引用是否不指向同一个对象。

示例:验证 obj1 和 obj2 是否引用同一个对象。如果两个对象引用不同的对象,测试用例将会失败,并输出指定的失败信息。

import static org.junit.jupiter.api.Assertions.assertSame;@Test
void testObjectReference() {Object obj1 = new Object();Object obj2 = obj1;assertSame(obj1, obj2, "两个对象应该引用同一个对象");
}
⑤验证是否满足指定条件

assertThat(actual, matcher):使用Matcher对象验证实际值是否满足指定条件。
assertThat 方法接受两个参数:实际值和Matcher对象。Matcher对象定义了对实际值的特定条件,例如包含特定子串、大于某个值等。通过使用Matcher对象,可以实现更加灵活和具体的断言验证。
示例1:

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;// 示例:验证字符串是否包含指定子串
String actual = "Hello World";
Matcher<String> containsString = containsString("Hello");
assertThat(actual, containsString);

示例2:


// 示例:验证数字是否大于指定值
int actualNumber = 10;
Matcher<Integer> greaterThan = greaterThan(5);
assertThat(actualNumber, greaterThan);

4.2)使结果直接失败

⑥使测试用例失败:fail()

直接使测试用例失败,可用于标记测试用例未通过的情况。

import static org.junit.jupiter.api.Assertions.fail;@Test
void testSomething() {// 执行一些测试逻辑// 如果满足特定条件,则强制测试失败if (conditionIsMet) {fail("Test 测试 失败 because xxxx");}
}

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

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

相关文章

springboot-web服务迁移Kubernetes

1、搞定基础镜像 docker pull openjdk:8-jre-alpine docker tag openjdk:8-jre-alpine 10.204.82.15/kubernetes/openjdk:8-jre-alpine docker push 10.204.82.15/kubernetes/openjdk:8-jre-alpine 2、springboot-web应用服务打包 3、编写Dockerfile构建镜像 FROM 10.204.82.…

深入了解CMSIS:ARM Cortex微控制器软件接口标准介绍

CMSIS (Cortex Microcontroller Software Interface Standard) 是ARM公司提供的一套规范和接口&#xff0c;旨在为Cortex-M系列微控制器提供一致的软件接口&#xff0c;以提高开发效率和可移植性。本文将深入介绍CMSIS的各个部分和功能&#xff0c;并解释其在嵌入式系统开发中的…

Elasticsearch 中的索引的分区(Shards)和副本(Replicas)的使用

Elasticsearch是一个高性能的、分布式的搜索与数据分析引擎&#xff0c;广泛用于全文搜索、结构化搜索、分析以及这三者的组合场景。在Elasticsearch中&#xff0c;“索引”&#xff08;Index&#xff09;是其最基本的数据管理单位&#xff0c;可以类比为传统关系数据库中的“数…

Affinity Photo值不值得买 Affinity Photo多少钱

照片编辑软件在设计师和摄影爱好者中都扮演着重要的角色&#xff0c;而Affinity Photo作为一款备受赞誉的专业级照片编辑软件&#xff0c;值不值得购买呢&#xff1f;Affinity Photo多少钱&#xff1f;下面我们将从多个方面来评估其价值。 一、Affinity Photo值不值得买&#x…

利用CMSIS-RTOS实现多任务调度和同步

在嵌入式系统中&#xff0c;多任务调度和同步对于实现复杂的应用程序非常重要。CMSIS-RTOS是一套针对嵌入式系统的操作系统接口规范&#xff0c;它定义了一组API函数&#xff0c;可用于在嵌入式系统上实现任务调度、同步和通信等功能。本文将介绍如何利用CMSIS-RTOS实现多任务调…

Redis分布式锁的使用案例

一、引入依赖 <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.5.0</version> </dependency> 二、工具类 package com.hl.redisdemo.util;import redis.clients.jedi…

学习Android的第四天

目录 Android FrameLayout ( 帧布局 ) FrameLayout size 大小 FrameLayout 属性 Android GridLayout ( 网格布局 ) GridLayout 属性 计算器布局 Android AbsoluteLayout 绝对布局 AbsoluteLayout 四大控制属性 Android FrameLayout ( 帧布局 ) FrameLayout 是 Android…

K210开发板开箱介绍

一、正面有一个电容触摸屏 二、左上角是一个Type-C接口&#xff0c;可用来供电以及下载程序 三、右上角是一个三向的拨动开关&#xff0c;分别是向左、向右、向下三个通道 四、右侧这个是复位按键 五、这部分是wifi模块的一个串口以及按键 六、wifi模块在开发板的背面&#xff…

北斗导航 | 接收机自主完好性监测算法研究成果及研究团队介绍

===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 近年来,接收机自主完好性监测(Receiver Autonomous Integrity Monito…

板块零 IDEA编译器基础:第三节 下载和在IDEA中集成 Tomcat服务器 来自【汤米尼克的JAVAEE全套教程专栏】

板块零 IDEA编译器基础&#xff1a;第三节 下载和在IDEA中集成 Tomcat服务器 一、为什么选择Tomcat&#xff08;1&#xff09;常见的JAVA WEB服务器&#xff08;2&#xff09;选择Tomcat的理由 二、Tomcat 8.5下载解压三、Tomcat 结构目录四、在IDEA中集成Tomcat 假设我们已经…

day06-Flex布局

01-标准流 标准流也叫文档流&#xff0c;指的是标签在页面中默认的排布规则&#xff0c;例如&#xff1a;块元素独占一行&#xff0c;行内元素可以一行显示多个。 02-浮动 基本使用 作用&#xff1a;让块元素水平排列。 属性名&#xff1a;float 属性值 left&#xff1a;左…

【element-ui】el-select下拉框el-date-picker弹出框定位问题解决方案

问题描述&#xff1a; 项目开发过程中发现el-select和el-date-picker弹出框显示时候&#xff0c;滚动屏幕&#xff0c;导致弹出框定位出现问题。 首先考虑到看一下element-ui官网提供的api&#xff0c;如下图 1、select提供了popper-append-to-body属性的配置 代码如下&#x…

VoIP之主备注册服务器机制

在IP话机的实际使用中&#xff0c;不可避免的会出现服务器离线运维、服务宕机、IP话机和服务器连接中断等情况。为了保证电话服务的连续性&#xff0c;在VoIP部署服环境中必须有冗余机制。常见的冗余机制以主备服务器的形式实现。 一、主备机制原理 话机正常情况下注册在主服…

【lesson44】进程间通信之匿名管道

文章目录 理解进程通信管道理解使用管道1.创建管道2.fork创建子进程3.构建单向通信信道子进程构建通信父进程构建通信 使用管道的完整版代码扩展Task.hppProcessPool.cc 理解进程通信 进程运行具有独立性—>进程想通信&#xff0c;难度其实是比较大的---->进程通信的本质…

DFS——剪枝

dfs在每个点&#xff08;状态&#xff09;的情况比较多&#xff0c;但是节点比较少的时候很常用&#xff0c;我们将每个状态的情况延伸出去&#xff0c;可以画出一棵搜索树。dfs会搜到每一种情况&#xff0c;所以我们实际上可以按照任意顺序来判否。为了优化搜索我们可以在搜索…

喵的一下午(分享今天的趣事)

2024/2/7 晚 喵喵我呀&#xff0c;起的很晚。又没有敲算法。于是&#xff0c;今天就没法发CSDN了。 每天&#xff0c;我还是特别喜欢看阅读量增加没&#xff0c;有没有人点赞&#xff0c;或者说添加收藏&#xff0c;当然&#xff0c;如果又多一个关注的朋友&#xff0c…

数据结构——单链表详解

目录 前言 一.什么是链表 1.概念 ​编辑 2.分类 二.单链表的实现(不带头单向不循环链表) 2.1初始化 2.2打印 2.3创建新节点 2.4头插、尾插 2.5头删、尾删 2.6查找 2.7在指定位置之前插入 2.8在指定位置之后插入 2.9删除pos位置 2.10删除pos之后的 2.11销毁链表…

《java 从入门到放弃》1.1 jdk 安装

1.jdk 是啥&#xff1f; jdk&#xff08;Java Development Kit&#xff09;&#xff0c;简单来说&#xff0c;就是java的开发工具。允许java 程序就是用它了。 jre &#xff0c;里面放的是java用的那些公用的包。 2.jdk下载 2.1 官网下载地址&#xff1a;Java Downloads | …

快团团如何正确推品 ?我想你还不清楚!

快团团如何正确推品 &#xff1f;我想你还不清楚&#xff01; ❌多数新手快团团团长都会犯的一个误区 ➡️为什么每天都有推荐很多产品&#xff0c;但却没什么人买&#xff1f;原因其实在于&#xff0c;每天发的数量太多&#xff0c;容易让顾客与想要合作的团长认为你对团品研…

【春节特辑】金融IT运维新视角:回望2023年变革浪潮,前瞻2024年创新风潮

随着金融行业的数字化转型加速&#xff0c;银行、证券、基金等机构的信息化建设日益成为业务发展的核心驱动力。运维管理软件&#xff0c;特别是其IT基础监控功能&#xff0c;对于确保金融系统稳定、安全、高效运行至关重要。 本文将回顾2023年金融行业信息化建设中IT基础监控…