PowerMock 模拟静态无法模拟类

时间:2021-01-27 08:20:59

标签: junit mockito junit4 powermock powermockito

我有一个使用 power mock 运行的测试用例。下面是代码

ParamControllerTest.java

    @RunWith(PowerMockRunner.class)
    @PrepareForTest(XYZ.class)
    public class ParamControllerTest{
    
    private HttpServletRequest request;
    private ParamController paramController;
    private ParamVO2 paramVO2;
    private String userId = "123456";
    private String access = "re";
    
    @Mock
    private XYZdaoMock xYZdaoMock;
    
    @Test
        public void testAddSecty(){
            request = PowerMockito.mock(HttpServletRequest.class);
// You do get request value as HttpServletRequest
            PowerMockito.mockStatic(XYZ.class);
            when(XYZ.getId(request)).thenReturn(id);
            when(XYZ.getAccess(userId, "bcd")).thenReturn("re");
            when(XYZ.getId(request)).thenReturn("123456");
            when(xYZdaoMock.updateKey(paramVO2)).thenReturn(paramVO2);
            paramController.addParam(paramVO2);
            verify(xYZdaoMock).updateKey(paramVO2); 
            
        }
    }

ParamController.java

@Controller
@RequestMapping(value="/param")
@Transactional(propagation=Propagation.REQUIRED,rollbackFor = Exception.class)
public class ParamController {
    
@RequestMapping(value="/abc", method = RequestMethod.POST)
    public @ResponseBody ParamVO addParam(@RequestBody ParamVO paramVO){
        ParamVO paramVO = null;
        String userId = XYZ.getId(request);
// userId result null as request is null and due to which after this it result in NullPointerException
        // Code
        return paramVO;             
        
    }
}

考虑到控制器中 userId 上的空指针,PowerMockito.mockStatic(XYZ.class) 我认为这是错误的。我读到了这个,显然这不适用于适当版本的 mockito 和 power mockito。我尝试注释掉 pom 中的 mockito 依赖项,使其不与 power mockito 的版本冲突,但它不起作用。以下是我尝试过的 power mockito 版本,但没有一个有效。使用的 Spring 版本是 4.3.19。 尝试的 Power Mockito 版本是 1.4.12,它在运行测试用例和 1.7.3 时给出了 XYZ.class 的初始化错误,结果是 NullPointerException,如上所示。

pom.xml

    <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.13</version>
                <scope>test</scope>
            </dependency>
            <!-- <dependency>
                <groupId>org.mockito</groupId>
                <artifactId>mockito-all</artifactId>
                <version>1.10.19</version>
                <scope>test</scope>
            </dependency> -->
            <dependency>
                <groupId>org.powermock</groupId>
                <artifactId>powermock-module-junit4</artifactId>
                <version>1.7.3</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.powermock</groupId>
                <artifactId>powermock-module-junit4-rule</artifactId>
                <version>1.7.3</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.powermock</groupId>
                <artifactId>powermock-classloading-xstream</artifactId>
                <version>1.7.3</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.powermock</groupId>
                <artifactId>powermock-api-mockito</artifactId>
                <version>1.7.3</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.powermock</groupId>
                <artifactId>powermock-module-junit4-legacy</artifactId>
                <version>1.7.3</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.powermock</groupId>
                <artifactId>powermock-api-easymock</artifactId>
                <version>1.7.3</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.easymock</groupId>
                <artifactId>easymock</artifactId>
                <version>3.0</version>
                <scope>test</scope>
            </dependency>
<!-- <dependency>
            <groupId>org.javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.20.0.GA</version>
        </dependency> -->

错误跟踪

java.lang.NullPointerException
    at com.Value(ParamController.java:184)
    at com..testAddSecty(ParamControllerTest.java:218)
    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.junit.internal.runners.TestMethod.invoke(TestMethod.java:68)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:326)

任何有关如何解决此问题的帮助。

0 个答案:

没有答案