Mockito要求即使添加@preparefortest之后,也要求添加@preparefortest



我有以下简单代码。我有一个课程(测试阶级),我想测试" somemethod"。有一种外部静态方法,由我的" somemethod"称为。我想为powermock恢复一些虚拟对象。我在开始中有@preparefortest(externalClass.class),但是当我执行时,它会出现错误:

班级外部阶级未准备进行测试。要准备此类课程,请将类添加到'@PrepareForTest'注释中。如果您不使用此注释,请在类或方法级别上添加注释。

请帮助我指出我使用@PrepareForTest

的方式出了什么问题
@RunWith(PowerMockRunner.class)
@PrepareForTest(ExternalClass.class)
public class xyzTest {  
    @Mock
    private RestTemplate restTemplate;
    @Mock
    private TestClass testClass;
    @BeforeClass
    private void setUpBeforeClass() {
        MockitoAnnotations.initMocks(this);
    }
    @Test
    public void testSuccessCase() {
        Boolean mockResponse = true;
        ResponseEntity<Boolean> response = new ResponseEntity<Boolean>(mockResponse, HttpStatus.OK);
        SomeClass someClass = new SomeClass("test", "1.0.0", "someUrl", "someMetaData");
        PowerMockito.mockStatic(ExternalClass.class);
        Mockito.when(restTemplate.postForEntity(any(String.class), any(String.class), eq(Boolean.class))).thenReturn(response);
        Mockito.when(ExternalClass.getSomeClass(any(String.class))).thenReturn(someClass);
        Boolean result = testClass.someMethod("test");
        Assert.isTrue(result);
        Mockito.verify(restTemplate, times(1)).postForObject(any(String.class), any(String.class), any());
    }
}

确保您也将@RunWith(PowerMockRunner.class)添加到同类的顶部。

:: EDIT ::两年后...

永远不要使用PowerMockito,您不需要。

如果确实需要,您很可能会违反坚实的原则,并且您的设计是错误的。

改用设计。

与最后一个答案一样,我的问题也是混合了测试NG而不是Junit Test的测试注释。

import org.junit.Test; // works
import org.testng.annotations.Test // did not work

非常令人讨厌的错误,我花费了超过5个小时的调试:(

对于那些试图与junit 5一起使用的人,如果您使用的是powermock-module-junit4 beta版本,该版本声称与4 兼容,则该库仍然无法识别:

import org.junit.jupiter.api.Test;

它将抛出:

org.powermock.api.mockito.ClassNotPreparedException

当将@PrepareForTest应用于要静态模拟的类上时。如果您想使用PowerMock,则必须返回Junit 4或目前为静态方法创建Mockwrapper。

PowerMock 2.0:GitHub路线图

毫无疑问,此处的最高答案是正确的,但这并没有回答为什么需要的问题;或者,例如,为什么同一件事不适用于添加@RunWith(MockitoJUnitRunner.class)

事实是PowerMockRunner在引擎盖下使用仪器API,Javassist库,这允许更改类,例如删除final或模拟static(非编译时间常数)。

在修改(仪器)某个类的过程中,它们添加了一个接口,称为PowerMockModified。这是一个标记接口,表示发生了某个字节代码仪器。在代码的后面,他们只需检查您在@PrepareForTest中使用的类是否实际上是通过某种方式来仪器的,通过这种方法:

    private boolean isModifiedByPowerMock() {
        return PowerMockModified.class.isAssignableFrom(this.type);
    }

事实证明, PowerMockRunner 做一些仪器,而 MockitoJUnitRunner却没有;因此,您遇到的错误。

我有相同的错误,通过添加

解决了这一点
@Rule
public PowerMockRule rule = new PowerMockRule();

在测试类中。

检查import org.junit.test;软件包已导入,而不是API木星。

如果上述答案不工作,请尝试extends PowerMockTestCase。这个技巧对我有用。

示例: public class xyzTest extends PowerMockTestCase

我有相同的错误,但解决了。我的问题是我包括powermock-module-junit4,但包括我的测试注释,而不是Junit。

i有相同的错误。我正在使用TestNG运行测试。我必须使用以下方法来解决上述问题。

@ObjectFactory
    public IObjectFactory getObjectFactory() {
        return new PowerMockObjectFactory();
    }

用于testng,有2个选项,如下:

  1. 使用以下的对象捕集:
    @ObjectFactory
    public IObjectFactory getObjectFactory() {
        return new PowerMockObjectFactory();
    }
  1. 测试类扩展extends org.powermock.modules.testng.PowerMockTestCase

我的gradle使用junit 5。

test {
    useJUnitPlatform()
}

我能够调试这个。通过在PowerMockrunner方法中具有断点。它没有被调用。此外,Junit 5不受PowerMockito的支持。

看起来Junit5在没有@ExtendWith的情况下运行。

确保您正在使用 PowerMock2 。当我使用 PowerMock 时,我遇到了这个问题。使用

import org.powermock2.api.mockito.PowerMockito;

相关内容

  • 没有找到相关文章

最新更新