赞
踩
大家好,我是G探险者!
今天我们简单聊聊单元测试的哪些事儿~
两天时间我玩明白了单元测试的套路。
这里我分享一下思路。
在我眼里单元测试室什么?
请看这张草图:
单元测试主要关注单个代码单元(通常是类或方法)的逻辑正确性,而不是功能测试的全面性。具体来说:
分析需要mock的对象和行为
创建mock对象的方式
@Mock
注解或Mockito.mock()
方法创建mock对象。@RunWith(MockitoJUnitRunner.class)
或MockitoAnnotations.initMocks(this)
来初始化@Mock
注解的字段。mock的目的
mock对象和行为
when().thenReturn()
模拟方法返回特定值。when().thenThrow()
模拟方法抛出异常。thenReturn()
多次或thenAnswer()
模拟连续调用时的不同结果。verify()
方法验证方法的调用次数和顺序,确保逻辑执行的正确性。这里我总结了一些些单元测试基本套路吧,整理一个模板。
假设我们有一个类 MyClass
和其中的一个方法 myMethod
。在分析该方法时,你需要考虑以下几个方面:
假设 MyClass
的 myMethod
如下:
- public class MyClass {
- private MyDependency dependency;
-
- public MyClass(MyDependency dependency) {
- this.dependency = dependency;
- }
-
- public String myMethod(String input) {
- String transformedInput = input.toUpperCase();
- boolean isValid = dependency.validate(transformedInput);
- if (isValid) {
- return "Valid: " + transformedInput;
- } else {
- return "Invalid: " + transformedInput;
- }
- }
- }
input
(字符串)MyDependency
(通过构造函数注入)dependency.validate(transformedInput)
"Valid: " + transformedInput
或 "Invalid: " + transformedInput
- import static org.mockito.Mockito.*;
- import static org.junit.Assert.*;
- import org.junit.Before;
- import org.junit.Test;
- import org.junit.runner.RunWith;
- import org.mockito.InjectMocks;
- import org.mockito.Mock;
- import org.mockito.MockitoAnnotations;
- import org.powermock.modules.junit4.PowerMockRunner;
- import org.powermock.modules.junit4.PowerMockRunnerDelegate;
- import org.mockito.runners.MockitoJUnitRunner;
-
- @RunWith(PowerMockRunner.class)
- @PowerMockRunnerDelegate(MockitoJUnitRunner.class)
- public class MyClassTest {
-
- @Mock
- private MyDependency mockDependency;
-
- @InjectMocks
- private MyClass myClass;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- }
-
- @Test
- public void testMyMethod_ValidInput() {
- // Arrange
- String input = "test";
- String transformedInput = "TEST";
- when(mockDependency.validate(transformedInput)).thenReturn(true);
-
- // Act
- String result = myClass.myMethod(input);
-
- // Assert
- assertEquals("Valid: TEST", result);
- verify(mockDependency).validate(transformedInput);
- }
-
- @Test
- public void testMyMethod_InvalidInput() {
- // Arrange
- String input = "test";
- String transformedInput = "TEST";
- when(mockDependency.validate(transformedInput)).thenReturn(false);
-
- // Act
- String result = myClass.myMethod(input);
-
- // Assert
- assertEquals("Invalid: TEST", result);
- verify(mockDependency).validate(transformedInput);
- }
- }
MyClassTest
测试类。@Mock
注解创建 MyDependency
的mock对象。setUp
方法中初始化mock对象,并创建 MyClass
实例。myMethod
在 validate
方法返回 true
和 false
的情况下的行为。verify
方法验证依赖对象的方法调用情况。通过这个模板,你可以系统地分析并编写单元测试,确保测试的全面性和准确性。
当然现在idea 里面有相关的些单元测试的插件,比如Squaretest,或者你直接通过ChatGPT来写。但是你得知道原理。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。