0

我需要为遗留系统构建单元测试(使用 junit)。我需要测试的方法使用静态方法,我需要检查它是否被调用。所以,我需要使用 PowerMockito(对于“常规”模拟,我们使用 mockito)。

但是,当我在测试中包含 PowerMockito 语句时,Mockito 失败并显示org.mockito.exceptions.misusing.UnfinishedStubbingException. 如果我评论这些行PowerMockito.mockStatic(Application.class), PowerMockito.doNothing().when(Application.class) and PowerMockito.verifyStatic(),UnfinishedStubbingException 不会发生,但是这样,我无法检查我的 IllegalArgumentException 是否发生。

被测方法如下所示:

public class ClientMB {

   public void loadClient(Client client) {
      try {
         if (client == null) {
            throw new IllegalArgumentException("Client is mandatory!");
         }

         setClient(clientService.findById(client.getId()));
      } catch (Exception ex) {
         Application.handleException(ex);
      }
   }
}

测试看起来像:

@PrepareForTest({ Application.class })
@RunWith(PowerMockRunner.class)
public class ClientMBTest {

   @Test
   public final void testLoadClient() {
      ClientService mockedClientService = Mockito.mock(ClientService.class);
      Mockito.when(mockedClientService.findById(42L)).thenReturn(new Client());

      PowerMockito.mockStatic(Application.class);
      PowerMockito.doNothing().when(Application.class);

      ClientMB cmb = new ClientMB(mockedClientService);
      mb.loadClient(null);

      PowerMockito.verifyStatic();
   }
}

我使用最新版本导入了 PowerMokito。

<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-module-junit4</artifactId>
    <version>1.6.2</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-api-mockito</artifactId>
    <version>1.6.2</version>
    <scope>test</scope>
</dependency>

我做错了什么?欢迎任何建议。

4

1 回答 1

2
PowerMockito.doNothing().when(Application.class);

这是一个存根命令,但是因为您没有在之后进行方法调用when(...),所以它是unfinished

PowerMockito.doNothing().when(Application.class);
Application.someApplicationMethod();

您需要使用这种语法,因为普通doVerb().when(foo)语法会提供一个实例,而 Java 在尝试基于实例而不是类名调用静态方法时经常会发出警告。

如果你想存根应用程序的所有方法,你可以通过传递另一个参数来做到这一点mockStatic

PowerMockito.mockStatic(Application.class, RETURNS_SMART_NULLS);
于 2015-08-14T17:04:20.120 回答