静态方法单元测试

将mockito-core换成mockito-inline

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

先创建一个调用了静态方法的待测试类

import java.time.LocalDate;
 
public class Utils {
    public LocalDate getCurrentDate() {
        return LocalDate.now();//now()为静态方法
    }
}

创建单元测试类

@RunWith(MockitoJUnitRunner.class)
@SpringBootTest
@TestInstance(PER_CLASS)
class UtilsTest {
    @Autowired
    Utils utils;//注入待测试的类
    @MockBean
    MockedStatic<LocalDate> localDateMockedStatic;
    
    @BeforeAll
    void setUp() {
        localDateMockedStatic = mockStatic(LocalDate.class);//初始化静态类
    }
    
    @Test
    public void testGetCurrentDate() {
        LocalDate yearOf2000 = LocalDate.of(2000, 1, 1);
        localDateMockedStatic.when(
                () -> LocalDate.now())
                .thenReturn(yearOf2000);
        System.out.println(utils.getCurrentDate());
        assertEquals(2000, target.getCurrentDate().getYear());
    } 
}

打印结果

main:2000-01-01

测试通过,打印的日期是 2000-01-01。

Mockito Mock 静态方法的弊端

在实际应用 Mockito 对静态方法进行 Mock 的时候,发现在多线程的时候失效,问题在于mockStatic只对当前线程的调用有效。

 localDateMockedStatic = mockStatic(LocalDate.class);//初始化静态类

下面看个例子:

@Test
    public void testGetCurrentDate() {
     LocalDate yearOf2000 = LocalDate.of(2000, 1, 1);
        localDateMockedStatic.when(
                () -> LocalDate.now())
                .thenReturn(yearOf2000);
        System.out.println(Thread.currentThread().getName() + ":" + LocalDate.now()); 
        
     Thread thread = new Thread(() ->
     System.out.println(Thread.currentThread().getName() + ":" + LocalDate.now()));
     thread.start();
     thread.join();
}

打印结果:

main:2000-01-01
Thread-0:当前时间。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值