PowerMockito验证时间总是过去

时间:2018-01-04 14:17:59

标签: java junit mockito

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

  }
}

现在即使我将时间值更改为2或任何更高的值,它仍然会通过。

无论我在Mockito.times()放置什么价值,它总是通过

   Person.someVoidMethod();
   PowerMockito.verifyStatic(Person.class,times(6));
   Person.someVoidMethod();

我也尝试使用VerificationModeFactory.times(6)代替Mockito.times(6),但实际上没有任何区别。

2 个答案:

答案 0 :(得分:0)

如果没有更多细节我会说可能的解释是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

答案 1 :(得分:0)

愚蠢的我..我没注意到我使用的是PowerMockito.mock()而不是PowerMockito.mockStatic()。现在它正常工作:

  @Test
  public void testSomeVoidMethod() {

   PowerMockito.mockStatic(Person.class);

   Person.someVoidMethod();
   PowerMockito.verifyStatic(Person.class,Mockito.times(6));
   Person.someVoidMethod();


  }

}