我正在尝试使用Powermockiti.verify(mockObj, times(1))
来确定静态 void 方法已被调用过一次,但即使我将 times()
的值更改为任何其他数字,它仍然会通过。
要测试的类:
package nl.naturalis.nba.etl;
public class Person {
public static void someVoidMethod() {
System.out.println("someVoidMethod Called");
}
}
测试类:
/** * */
package com.test.using.mockito
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.atMost;
import org.powermock.api.mockito.PowerMockito;
@RunWith(PowerMockRunner.class)
@PrepareForTest(Person.class)
@PowerMockIgnore("javax.management.*")
@SuppressWarnings({"static-method"})
public class PersonTest {
/**
* @throws java.lang.Exception
*/
@Before
public void setUp() throws Exception {}
/**
* @throws java.lang.Exception
*/
@After
public void tearDown() throws Exception {}
/**
* Test method for {@link nl.naturalis.nba.etl.Person#someVoidMethod()}.
*/
@Test
public void testSomeVoidMethod() {
/* Person person = Mockito.mock(Person.class);
person.someVoidMethod();
Mockito.verify(person, times(1));
person.someVoidMethod();*/
PowerMockito.mock(Person.class);
Person.someVoidMethod();
PowerMockito.verifyStatic(Person.class,times(6));
Person.someVoidMethod();
}
}
现在,即使我将 times 的值更改为 2 或任何更高的值,它仍然会通过。
无论我在Mockito.times()
中投入了什么价值,它总是通过
Person.someVoidMethod();
PowerMockito.verifyStatic(Person.class,times(6));
Person.someVoidMethod();
我也尝试使用VerificationModeFactory.times(6)
而不是Mockito.times(6)
但实际上没有任何区别。
如果没有更多细节,我会说可能的解释是someVoidMethod
是一种静态方法。 如果是,大多数 IDE 会在您通过实例访问它的行上向您发出警告。
Mockito的工作原理是根据您传入的类创建动态代理。 对象上的方法将替换为执行验证、设置等的方法。 但是,调用静态方法时,它不会通过实例。 编译器将替换如下所示的任何调用:
ClassForTest classForTest = mock(ClassForTest.class);
verify(classForTest).someVoidMethod("foo");
进入这个:
ClassForTest classForTest = mock(ClassForTest.class);
verify(classForTest);
ClassForTest.someVoidMethod("foo");
因此完全绕过Mockito代码(包括验证(。
某些模拟库(如 PowerMock(允许您替换静态方法。 然而,Mockito没有,因为在大多数情况下它会鼓励糟糕的设计:https://github.com/mockito/mockito/issues/1013。
我。我没有注意到我使用的是PowerMockito.mock((而不是PowerMockito.mockStatic((。现在它工作正常:
@Test
public void testSomeVoidMethod() {
PowerMockito.mockStatic(Person.class);
Person.someVoidMethod();
PowerMockito.verifyStatic(Person.class,Mockito.times(6));
Person.someVoidMethod();
}
}