簡體   English   中英

PowerMockito:使用matchers模擬靜態方法時得到InvalidUseOfMatchersException

[英]PowerMockito: got InvalidUseOfMatchersException when use matchers mocking static method

當我測試這個靜態方法時

public class SomeClass {
    public static long someMethod(Map map, String string, Long l, Log log) {
        ...
    }
}

import org.apache.commons.logging.Log;

@RunWith(PowerMockRunner.class)
//@PrepareForTest(SomeClass.class)
public class Tests {
    @Test
    public void test() {
        ...
        PowerMockito.mockStatic(SomeClass.class);
        Mockito.when(SomeClass.someMethod(anyMap(), anyString(), anyLong(), isA(Log.class))).thenReturn(1L);
        ...
    }
}

我得到了InvalidUseOfMatchersException 我的問題是:

  1. 當所有參數都使用匹配器時,為什么會出現此異常? 怎么解決? 我調試了它,發現isA(Log.class)返回null。
  2. 當我將@PrepareForTest注釋添加到測試類並運行測試時,junit沒有響應。 為什么?

編輯

我試圖不使用參數匹配器,並得到了

org.mockito.exceptions.misusing.MissingMethodInvocationException:when()需要一個必須是'模擬上的方法調用'的參數。 例如:when(mock.getArticles())。thenReturn(articles);

此外,此錯誤可能會顯示,因為:

  1. 你存在以下任何一個:final / private / equals()/ hashCode()方法。 這些方法無法進行存根/驗證。

  2. 在when()中你不是在mock上調用方法而是在其他一些對象上調用方法。

在 ...

因此似乎是由於someMethod本身。 方法中有synchronized塊。 我想知道Powermockito是否可以嘲笑那種方法。

嘗試將isA()替換為另一個any()調用

Mockito.when(SomeClass.someMethod(anyMap(), anyString(), anyLong(), any(Log.class))).thenReturn(1L);

[編輯]

收到異常后檢查堆棧跟蹤。 您是否看到報告任何NoClassDefFoundError 我注意到當我沒有在我的項目中包含javassist.jar ,我得到了類似的錯誤。

我使用PowerMockito,這些是我添加到一個全新項目中的罐子,用於運行@Tom發布的代碼

  • powermock-的Mockito-1.4.10-full.jar
  • 的Mockito-ALL-1.8.5.jar
  • Javassist進行-3.15.0-GA.jar
  • JUnit的-4.8.2.jar
  • 共記錄-1.1.1.jar

最好檢查您是否使用兼容的JAR版本,還要檢查項目類路徑中是否存在任何其他沖突的JAR。

遲到總比沒有好,下面一行:

Mockito.when(SomeClass.someMethod(anyMap(), anyString(), anyLong(),
    isA(Log.class))).thenReturn(1L);

應該:

PowerMockito.when(SomeClass.someMethod(anyMap(), anyString(), anyLong(),
    isA(Log.class))).thenReturn(1L);

所以,不應該調用Mockito.when ,而應該調用PowerMockito.when

  1. isA將始終返回null 這是設計的,它在isA()方法的Javadoc中有記錄。 原因是null將始終匹配類的參數化返回類型,它將始終匹配使用isA()匹配器的存根方法中的參數類型。 返回的null值實際上不會被執行。

  2. 似乎對我來說很好。 我的完整測試用例:

import static org.mockito.Matchers.*;

import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.impl.SimpleLog;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

class SomeClass {
  public static long someMethod(final Map map, final String string, final Long l, final Log log) {
    return 2L;
  }
}

@RunWith(PowerMockRunner.class)
@PrepareForTest(SomeClass.class)
public class InvalidUseOfMatchersTest {
    @Test
    public void test() {
        // Mock the SomeClass' static methods, stub someMethod() to return 1
        PowerMockito.mockStatic(SomeClass.class);
        Mockito.when(SomeClass.someMethod(anyMap(), anyString(), anyLong(), isA(Log.class))).thenReturn(1L);

        // null NOT is-a Log, uses default stubbing: returns 0
        System.out.println(SomeClass.someMethod(null, null, 5L, null));
        // SimpleLog passes is-a test, uses stubbed result: returns 1
        System.out.println(SomeClass.someMethod(null, null, 7L, new SimpleLog("simplelog")));
    }
}

也許發布一個完整的例子來幫助診斷正在發生的事情?

<dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-all</artifactId>
        <version>${mockito.version}</version>
    </dependency>
    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-module-junit4</artifactId>
        <version>${powermock.version}</version>
        <type>jar</type>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-api-mockito</artifactId>
        <version>${powermock.version}</version>
        <type>jar</type>
        <scope>provided</scope>
    </dependency>

我希望你的項目使用maven。 嘗試將這些罐子包含在構建中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM