首页 > 解决方案 > org.powermock.reflect.exceptions.FieldNotFoundException

问题描述

美好的一天,我有 2 种方法的课程:首先是公共的 GetLeadRequestsList - 我想测试它,其次是私有的 LeadRequestListResponse - 由第一种方法使用。我嘲笑了第二种方法并调用了第一种方法。我的测试代码在这里。当我运行 testGetLeadRequestsList 时,我
发现了 org.powermock.reflect.exceptions.FieldNotFoundException:在 org.mockito.Mockito 的类层次结构中找不到类型为“org.mockito.internal.progress.MockingProgress”的静态字段。

at org.powermock.reflect.internal.matcherstrategies.FieldTypeMatcherStrategy.notFound(FieldTypeMatcherStrategy.java:40)
at org.powermock.reflect.internal.WhiteboxImpl.findSingleFieldUsingStrategy(WhiteboxImpl.java:502)
at org.powermock.reflect.internal.WhiteboxImpl.findFieldInHierarchy(WhiteboxImpl.java:455)
at org.powermock.reflect.internal.WhiteboxImpl.getInternalState(WhiteboxImpl.java:576)
at org.powermock.reflect.Whitebox.getInternalState(Whitebox.java:347)
at org.powermock.api.mockito.internal.PowerMockitoCore.getMockingProgress(PowerMockitoCore.java:45)
at org.powermock.api.mockito.internal.PowerMockitoCore.doAnswer(PowerMockitoCore.java:36)
at org.powermock.api.mockito.PowerMockito.doReturn(PowerMockito.java:790)
at ru.sbrf.sbi.ufs.business.rest.api.LeadRequestsControllerImplTest.setUp(LeadRequestsControllerImplTest.java:58)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:86)
at org.testng.internal.Invoker.invokeConfigurationMethod(Invoker.java:514)
at org.testng.internal.Invoker.invokeConfigurations(Invoker.java:215)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:589)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:820)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1128)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:129)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:112)
at org.testng.TestRunner.privateRun(TestRunner.java:782)
at org.testng.TestRunner.run(TestRunner.java:632)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:366)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:361)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:319)
at org.testng.SuiteRunner.run(SuiteRunner.java:268)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1244)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1169)
at org.testng.TestNG.run(TestNG.java:1064)
at com.intellij.rt.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:66)
at com.intellij.rt.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:110)

测试类中的错误在字符串中:doReturn(leadRequestsResponse).when(mock, "LeadRequestListResponse", ArgumentMatchers.anyBoolean());

import org.codehaus.jackson.map.ObjectMapper;
import org.junit.runner.RunWith;
import org.mockito.*;

import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import ru.sbrf.sbi.ufs.poi.vo.ErrorMessage;
import ru.sbrf.sbi.ufs.poi.vo.LeadRequestData;
import ru.sbrf.sbi.ufs.poi.vo.LeadRequestListResponse;
import ru.sbrf.sbi.ufs.poi.vo.ResponseStatus;

import java.util.ArrayList;

import static org.powermock.api.mockito.PowerMockito.*;
import static org.testng.Assert.*;

public class LeadRequestsControllerImplTest {

    @Spy
    LeadRequestsControllerImpl mock = new LeadRequestsControllerImpl();

    LeadRequestListResponse leadRequestsResponse;

    @BeforeMethod
    public void setUp() throws Exception {
        leadRequestsResponse = new LeadRequestListResponse();
        leadRequestsResponse.setResponseStatus(new ResponseStatus().withStatusCode(200L));
        ArrayList<LeadRequestData> requests = new ArrayList<>();
        requests.add(LeadRequestData.builder()
                .companyName("НПО Помощь")
                .lastName("Помоги")
                .firstName("Себе")
                .secondName("Сам")
                .build());
        leadRequestsResponse.setRequests(requests);
        doReturn(leadRequestsResponse).when(mock, "LeadRequestListResponse", ArgumentMatchers.anyBoolean());
    }

    @Test
    public void testGetLeadRequestsList() {
        try {
            String result = mock.getLeadRequestsList();
            ObjectMapper mapper = new ObjectMapper();
            String expect = mapper.writeValueAsString(leadRequestsResponse);
            assertEquals(expect, result,"GetLeadRequestsList isn't correct.");
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}

也许,任何人都知道如何检查错误。提前致谢

标签: javatestingexceptiontestngpowermock

解决方案


我想您使用的 mockito-core 和 powermock-api-mockito 版本不正确。因为如果使用这些库的不兼容版本,可能会出现 FieldNotFoundException。请使用支持版本图表 - https://github.com/powermock/powermock/wiki/Mockito#supported-versions

所以你需要检查你的版本并更正它。

你也应该做接下来的事情:

  1. 在 LeadRequestsControllerImplTest 之前添加 @RunWith(PowerMockRunner.class) 和 @PrepareForTest(LeadRequestsControllerImpl.class)
  2. 从 TestNG @BeforeMethod 更改为 JUnit 注释(例如 @BeforeClass),因为你不能混合它。

推荐阅读