6

当我测试这个静态方法时

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)返回为空。
  2. 当我将@PrepareForTest注释添加到测试类并运行测试时,junit 没有响应。为什么?

编辑

我试图不使用参数匹配器,并得到

org.mockito.exceptions.misusing.MissingMethodInvocationException: when() 需要一个参数,该参数必须是“模拟的方法调用”。例如:when(mock.getArticles()).thenReturn(articles);

此外,可能会出现此错误,因为:

  1. 你存根其中之一:final/private/equals()/hashCode() 方法。这些方法不能被存根/验证。

  2. 在 when() 中,您不会在模拟上调用方法,而是在其他对象上调用方法。

在 ...

所以这似乎是由于它someMethod本身。方法中有同步块。我想知道 Powermockito 是否可以模拟这种方法。

4

4 回答 4

2

尝试像这样将 isA() 替换为另一个 any() 调用

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

[编辑]

当你得到异常时检查你的堆栈跟踪。你看到有NoClassDefFoundError报道吗?我注意到当我没有将它包含javassist.jar在我的项目中时,我遇到了类似的错误。

我使用 PowerMockito,这些是我添加到一个全新项目中的 jar,用于运行 @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
  • common-logging-1.1.1.jar

检查您是否使用兼容的 JAR 版本,并检查您的项目类路径中是否有任何其他冲突的 JAR 始终是一个好主意。

于 2012-05-31T09:10:05.767 回答
1

迟到总比没有好,下面一行:

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

于 2016-06-09T14:08:23.690 回答
0
  1. isA 将始终返回null。这是设计使然,它记录在 isA() 方法的 Javadoc 中。这样做的原因是 null 将始终与类的参数化返回类型匹配,该类的返回类型将始终与使用 isA() 匹配器的存根方法中的参数类型匹配。返回的空值实际上并未被执行。

  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")));
    }
}

也许发布一个完整的例子来帮助诊断发生了什么?

于 2012-05-31T17:47:07.400 回答
-1
<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。尝试将这些 jar 包含到构建中。

于 2012-06-01T08:43:32.387 回答