【问题标题】:PowerMockito and Mockito conflictPowerMockito 和 Mockito 冲突
【发布时间】:2015-08-14 14:58:57
【问题描述】:

我需要为遗留系统构建单元测试(使用 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>

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

【问题讨论】:

    标签: junit mockito powermockito


    【解决方案1】:
    PowerMockito.doNothing().when(Application.class);
    

    这是一个存根命令,但是because you don't make a method call after the when(...), it's unfinished

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

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

    如果您想存根应用程序的所有方法,您可以通过将另一个参数传递给mockStatic

    PowerMockito.mockStatic(Application.class, RETURNS_SMART_NULLS);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多