Mockito+Junit5

实战

POM

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.nemo</groupId>
	<artifactId>demo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>demo</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>1.8</java.version>
	</properties>
	<dependencies>
		<dependency>
    		<groupId>org.mockito</groupId>
    		<artifactId>mockito-core</artifactId>
    		<version>4.4.0</version>
			<scope>test</scope>
		</dependency>

		<dependency>
    		<groupId>org.mockito</groupId>
    		<artifactId>mockito-inline</artifactId>
    		<version>4.4.0</version>
    		<scope>test</scope>
		</dependency>

		<dependency>
    		<groupId>org.junit.jupiter</groupId>
    		<artifactId>junit-jupiter-api</artifactId>
    		<version>5.8.2</version>
		</dependency>

		<dependency>
    		<groupId>org.projectlombok</groupId>
    		<artifactId>lombok</artifactId>
    		<version>1.18.22</version>
		</dependency>

	</dependencies>

</project>

TestDemo

public class TestDemo {

    @Autowired
    private TestRpcService testRPCService;

   public UserInfo getUser(Long id){

       if (id == null){
           throw new IllegalArgumentException();
       }

       try{
           UserInfo user = testRPCService.getUser(id);
           return user;
       }catch (Exception e){
           throw new RuntimeException();
       }
   }

   public void Test(){

   }
}

TestDemoTest(TestDemo的测试类)

class TestDemoTest {
    
    @InjectMocks
    //间谍。是基于一个真实的对象。Spy的所有方法都是真实的。通过Stub可以改变某个方法的行为
    @Spy
    private TestDemo testDemo;
    //基于某个接口或Class,创建一个假对象。对象的所有方法都是假的。通过Stub可以模拟某个方法的行为
    @Mock
    private TestRpcService testRPCService;
    
    @BeforeEach
    void setUp(){
        AutoCloseable autoCloseable = MockitoAnnotations.openMocks(this);
    }
    
    @Test
    void getUser() {
        
        //参数验证
        Long id = null;
        try{
            testDemo.getUser(id);
        }catch (Exception e){
            //验证是否抛出IllegalArgumentException
            Assertions.assertTrue(e instanceof IllegalArgumentException);
        }
        
        //静态方法
        id = TestUtil.testGetUserId();
        System.out.println("静态方法获取到用户id:"+id);
        
        //mock掉静态方法的值
        MockedStatic<TestUtil> testUtilMock = Mockito.mockStatic(TestUtil.class);
        testUtilMock.when(()->TestUtil.testGetUserId()).thenReturn(2L);
        id = TestUtil.testGetUserId();
        System.out.println("mock静态方法获取到用户id:"+id);
        
        //Mock Service正常运行
        UserInfo userInfo = getUserInfo(id);
        Mockito.when(testRPCService.getUser(id)).thenReturn(userInfo);
        userInfo = testDemo.getUser(id);
        //检验是否返回正确的结果
        Assertions.assertEquals(userInfo.getUserName(),"TEST1");
        Assertions.assertEquals(userInfo.getId(),2L);
        //mock的对象,getUserName方法,执行多次时,返回不同的值
        System.out.println("mock的用户信息第二次调用获得用户名:"+userInfo.getUserName());
        
        //Mock Service异常运行
        Mockito.when(testRPCService.getUser(id)).thenThrow(new RuntimeException());
        try{
            testDemo.getUser(id);
        }catch (Exception e){
            //验证是否抛出RuntimeException
            Assertions.assertTrue(e instanceof RuntimeException);
        }
        
    }
    
    UserInfo getUserInfo(Long id) {
        UserInfo userInfo = mock(UserInfo.class);
        //同一个方法,执行多次时,返回不同的值
        Mockito.when(userInfo.getUserName())
            .thenReturn("TEST1")
            .thenReturn("TEST2")
            .thenReturn("TEST3");
        Mockito.when(userInfo.getId()).thenReturn(id);
        return userInfo;
    }
    
    @Test
    void test() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        //mock final
        TestService mockFinal = mock(TestService.class);
        when(mockFinal.testFinal()).thenReturn("mock final");
        System.out.println(mockFinal.testFinal());
        
        //mock static
        MockedStatic<TestService> mockStatic = Mockito.mockStatic(TestService.class);
        mockStatic.when(()->TestService.testStatic()).thenReturn("mock static");
        System.out.println(TestService.testStatic());
        
        //mock private
        TestService testService = new TestService();
        Method method = TestService.class.getDeclaredMethod("testPrivate");
        method.setAccessible(true);
        String returnValue = (String) method.invoke(testService);
        Assertions.assertEquals(returnValue, "private");
    }
}

TestRpcService

public interface TestRpcService {

    UserInfo getUser(Long id);

}

TestService

public class TestService {
    
    public final String testFinal(){
        return "final";
    }
    
    public static String testStatic(){
        return "static";
    }
    
    private String testPrivate(){
        return "private";
    }
    
}

TestUtil

public class TestUtil {

    public static Long testGetUserId(){
        return 1L;
    }
}

UserInfo

@Data
public class UserInfo {

    private Long Id;

    private String userName;
}
Spring Boot是一个用于构建Java应用程序的开源框架,它提供了一种简化了配置的方式来快速构建应用程序。JUnit是一个用于编写和运行单元测试的开源测试框架,而Mockito是一个用于创建和管理模拟对象的Java库。 下面是一个使用Spring Boot、JUnit和Mockito进行单元测试的示例: 假设我们有一个UserService类,它依赖于一个UserRepository接口来访问数据库并进行一些操作。我们想要对UserService的方法进行单元测试。 首先,我们需要创建一个测试类,命名为UserServiceTest。在测试类中,我们将使用JUnit的注解来标记测试方法,并使用Mockito来创建模拟对象。示例代码如下: ```java @RunWith(MockitoJUnitRunner.class) public class UserServiceTest { @InjectMocks private UserService userService; @Mock private UserRepository userRepository; @Test public void testGetUserById() { // 配置模拟对象的行为 User user = new User("1", "John"); when(userRepository.findById("1")).thenReturn(user); // 调用被测试的方法 User result = userService.getUserById("1"); // 验证结果 assertEquals("John", result.getName()); } } ``` 在上面的示例中,我们使用了@RunWith注解来指定使用MockitoJUnitRunner运行测试,这样就能自动创建和管理模拟对象。使用@InjectMocks注解将被测试的对象自动注入到测试类中,使用@Mock注解创建模拟对象。 在testGetUserById方法中,我们首先使用when方法配置userRepository模拟对象的行为,表示当传入参数为"1"时,返回一个指定的User对象。 然后,我们通过调用userService的getUserById方法来测试该方法的逻辑。最后,使用assertEquals断言来验证结果是否符合预期。 以上就是一个使用Spring Boot、JUnit和Mockito进行单元测试的示例。通过使用Mockito创建模拟对象,我们可以更容易地测试各个方法的逻辑,而不依赖于实际的数据库。这样可以提高测试效率并确保代码的质量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值