静态方法单元测试

将mockito-core换成mockito-inline


    org.mockito
    mockito-inline
    3.6.0
    test

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

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 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:当前时间。

关注公众号 HEY DATA,一起交流更多 。

你可能感兴趣的:(静态方法单元测试)