使用 Mockito.mockStatic 模拟静态方法时出现 UnfinishedStubbingException

hao*_*ang 6 java unit-testing mockito

LocalDate.now()当使用 模拟静态方法时,我得到了这个异常Mockito.mockStatic()

org.mockito.exceptions.misusing.UnfinishedStubbingException:此处检测到未完成的存根:at utils.PowerMockTest.test(PowerMockTest.java:18)

例如 thenReturn() 可能会丢失。
正确存根的示例:when(mock.isOk()).thenReturn(true); 当(mock.isOk()).thenThrow(异常); doThrow(异常).when(mock).someVoidMethod(); 提示:

  1. 缺少 thenReturn()
  2. 您正在尝试存根最终方法,该方法不受支持
  3. 在“thenReturn”指令完成之前,您正在对内部另一个模拟的行为进行存根

代码是

public class MockStaticTest {
    @Test
    void test(){
        LocalDate today=LocalDate.of(2020,11,20);
        try (MockedStatic mocked = mockStatic(LocalDate.class)) {
            mocked.when(LocalDate::now).thenReturn(LocalDate.of(2020,11,10));
            Assertions.assertEquals(today,LocalDate.now());
            mocked.verify(atLeastOnce(),LocalDate::now);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我对异常消息有点困惑,因为我确实添加了thenReturn语句。
任何帮助,将不胜感激。

Jag*_*ags 6

您需要在 try 块之外实例化返回对象。

问题是您正在模拟该类LocalDate,然后尝试在模拟块中使用同一类try

mocked.when(LocalDate::now).thenReturn(LocalDate.of(2020,11,10));
Run Code Online (Sandbox Code Playgroud)

@sankv 答案有效,因为它实例化了LocalDate静态块之前返回的内容。


小智 -1

你尝试过mocked.when(LocalDate.now()).thenReturn(LocalDate.of(2020,11,10)); ?

  • 请不要以看起来像问题的方式编写答案。有适当的系统来检查未答复 (NAA) 帖子。这个答案被其中一个人错误地采纳了。请考虑对其进行编辑,使其看起来更像一个答案。 (2认同)