PowerMockito 验证时间总是过去



我正在尝试使用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();

  }
}

相关内容

  • 没有找到相关文章

最新更新