我有一个类,其中一个公共非静态方法在内部执行静态方法调用,当我试图在junit中使用mock进行测试时,需要模拟静态。
我做错了什么?
class DummyClass {
public boolean filter(CharSequence source) {
return Character.isHighSurrogate(source.charAt(7));
}
}
@Test
public void testDummyCharacterMockedStatic() {
try (MockedStatic<Character> mocked = Mockito.mockedStatic(Character.class)) {
CharSequence source = "안녕하세요 세계";
mocked.when(() -> Character.isHighSurrogate(anyChar())).thenReturn(true);
DummyClass d = new DummyClass();
assertTrue(d.filter(source));
}
}
错误显示以下>>>
在这里检测到错位或滥用的参数匹配器:
→在DummyTest.lambda testDummyCharacterMockedStatic 0美元(DummyTest.java: 37)
不能在验证或存根之外使用参数匹配器。参数匹配器的正确用法示例:当(mock.get (anyInt ())) .thenReturn(空);doThrow(新RuntimeException())当(模拟).someVoidMethod (anyObject ());验证(模拟).someMethod(包含("foo")
此消息可能出现在NullPointerException之后,如果最后一个Matcher返回一个类似any()的对象,但是是存根方法签名需要一个原始参数,在这种情况下,使用primitive替代方案。当(mock.get (()));//使用不当,会提高NPE当(mock.get (anyInt ()));//正确用法use
同样,这个错误可能会出现,因为你使用参数匹配器不能被模拟的方法。下列方法不能为存根/验证:最后/私人/equals()和hashCode()。模拟的方法不支持在非公共父类上声明。
对于我们不拥有的类型是不可能的
"Character"是来自"java.lang.*"包
警告
内联mock生成器是Mockito的一个可选特性。
mockitto在mockitto . mockstatic的JavaDoc中包含了这个说明。
注意:我们建议不要模拟标准库中类的静态方法或自定义类加载器使用的类的静态方法用模拟类执行代码块。制假人可能会禁止模拟已知类的静态方法问题。同样,如果静态方法是jvm固有的,它就不能通常被嘲笑,即使没有明确禁止。
Mockito发出的错误消息。mockStatic可能很宽泛,而且令人困惑。低级标准库类的静态模拟可能不可靠,并且具有不可预测的效果。可能需要一些实验来微调这个强大功能的使用。
Ref: https://site.mockito.org/>"More">
记得
- 不要模拟你不拥有的类型
- 不要模拟值对象
- 用你的测试来表达你的爱!