在Mockito 2中存根静态方法会抛出InvalidUseOfMatchersException

时间:2018-04-04 19:32:06

标签: java mockito powermock

我有一个类,我使用Powermock + Mockito来抑制实用程序类中的静态方法。它适用于Powermock 1.6.2和Mockito 1.10.19,但我的任务是迁移到Java 10(JRE:我们仍在使用Java 8进行编译),所以我已经转移到Powermock 2(目前处于测试阶段) )和Mockito 2.16.1。现在,我一直得到org.mockito.exceptions.misusing.InvalidUseOfMatchersException: Misplaced or misused argument matcher detected here

一个简单的例子,MyMockito.java:

import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import java.lang.reflect.Method;

import static org.mockito.Mockito.any;
import static org.powermock.api.mockito.PowerMockito.spy;
import static org.powermock.api.mockito.PowerMockito.when;
import static org.powermock.api.support.membermodification.MemberMatcher.method;
import static org.powermock.api.support.membermodification.MemberModifier.suppress;

@RunWith(PowerMockRunner.class)
@PrepareForTest(StringMeasurer.class)
public class MyMockito {
    @Test
    public void testSuppressMethod() throws Exception {
        spy(StringMeasurer.class);
        Method measure = method(StringMeasurer.class, "measure", String.class);
        suppress(measure);
        when(StringMeasurer.class, measure)
                .withArguments(any(String.class))
                .thenReturn(10);
        System.out.println(StringMeasurer.measure("Hello"));
    }

和StringMeasurer.java:

    public class StringMeasurer {
        private StringMeasurer() {}
        public static int measure(String s) {
            return s.length();
        }
    }
}

我假设对于如何使用匹配器来匹配存根静态方法中的参数进行了一些更改,否则这应该从不已经工作并以某种方式通过Mockito 2(或者这可能是Powermock beta中的一个错误。谁能让我对我做错了什么有所了解?

2 个答案:

答案 0 :(得分:1)

PowerMock的工作解决方案2.0.0-beta.5

import static org.mockito.ArgumentMatchers.any;
import static org.powermock.api.mockito.PowerMockito.when;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class)
@PrepareForTest(StringMeasurer.class)
public class MyMockito {
    @Test
    public void testSuppressMethod() throws Exception {
        PowerMockito.mockStatic(StringMeasurer.class);
        when(StringMeasurer.measure(any(String.class))).thenReturn(10);
        System.out.println(StringMeasurer.measure("Hello"));
    }
}

更多详细信息可以在PowerMock官方文档中找到:Mocking Static Method

答案 1 :(得分:0)

该问题使用import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import java.lang.reflect.Method; import java.util.List; import static junit.framework.Assert.assertEquals; import static org.mockito.Mockito.*; import static org.powermock.api.support.membermodification.MemberMatcher.method; import static org.powermock.api.mockito.PowerMockito.doReturn; import static org.powermock.api.mockito.PowerMockito.spy; @RunWith(PowerMockRunner.class) @PrepareForTest(StringMeasurer.class) public class MyMockito { @Test public void testSuppressMethod() throws Exception { spy(StringMeasurer.class); Method measure = method(StringMeasurer.class, "measure", String.class); doReturn(10).when(StringMeasurer.class, measure) .withArguments(any(String.class)); System.out.println(StringMeasurer.measure("Hello")); List<String> dummy = StringMeasurer.dummy(5); assertEquals(5, dummy.size()); dummy.forEach(System.out::println); } } 方法,这是部分模拟所必需的,尽管给出的示例只有一个静态方法,因此这里不需要。这是一个工作解决方案,它使用部分模拟作为扩展示例:

MyMockito.java:

import java.util.ArrayList;
import java.util.List;

public class StringMeasurer {
    private StringMeasurer() {}
    public static int measure(String s) {
        return s.length();
    }
    public static List<String> dummy(int size) {
        List<String> list = new ArrayList<>();
        for (int i = 0; i < size; i++) {
            list.add("" + i);
        }
        return list;
    }
}

和StringMeasurer.java:

StringMeasurer.dummy()

请注意,在这种情况下,接受的解决方案也会模拟assertEquals()方法,返回一个空列表,测试将在import pandas as pd import numpy as np # get all data as panda DataFrame data = pd.read_csv("./monthdata.csv") print(data) # get values as numpy array data_ar = data.values # numpy.ndarray, every element is a row for row in data_ar: print(row) sum = 0 count = 0 for month in np.nditer(row, flags=["refs_OK"], op_flags=["readwrite"]): print month 上失败。