具有PowerMockRunner的静态功能

问题描述 投票:0回答:1

我有一个从缓存实例中获取数据的函数,我需要对其进行模拟

public List<Map<String, Object>> getDuplicateCheckNotificationJSON(String identityAction) {
        IdentityActions identityActions = IdentityActionsCache.getInstance().getIdentityActionsByName(identityAction);


        List<RequestCategoryView> requestCategoryViews= identityActions.getReqCategory().getReqCategoryViews();
        for (RequestCategoryView requestCategoryView : requestCategoryViews) {
        ...
        }
        return null;
    }

IdentityActionsCache类

public static IdentityActionsCache getInstance() {
        if(null == singleton) {
            singleton = new IdentityActionsCache();
            singleton.init();
        }
        return singleton;
    }

public IdentityActions getIdentityActionsByName(String actionName){
    xyz
    return result;
}

带有powermock的Junit

@RunWith(PowerMockRunner.class)
@PrepareForTest({IdentityService.class, IdentityActionsCache.class})
public class IdentityServiceTest  {

@InjectMocks
IdentityService identityService;



 @Test
    public void getDuplicateCheckNotificationJSONTest() {
        List<Map<String, Object>> result;
        try {
            PowerMockito.mockStatic(ServiceLocator.class);
            PowerMockito.mockStatic(IdentityActionsCache.class);
            when(ServiceLocator.findService("workflowConfigDataService")).thenReturn(workflowConfigDataService);

            IdentityActions identityActions = new IdentityActions();

when(IdentityActionsCache.getInstance().getIdentityActionsByName(action)).thenReturn(identityActions);

            result = identityService.getDuplicateCheckNotificationJSON(action);


            assertTrue(result.equals(1l));
        } catch (ALNTApplicationException e) {
            assertFalse(false);
        } 
    }
}

我无法模拟IdentityActionsCache.getInstance()。getIdentityActionsByName(action)获取空指针

java.lang.NullPointerException在com.alnt.idm.user.identity.services.IdentityServiceTest.getDuplicateCheckNotificationJSONTest(IdentityServiceTest.java:70)在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处在sun.reflect.NativeMethodAccessorImpl.invoke(未知来源)在sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源)在java.lang.reflect.Method.invoke(未知来源)在org.junit.internal.runners.TestMethod.invoke(TestMethod.java:68)在org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl $ PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:310)处在org.junit.internal.runners.MethodRoadie $ 2.run(MethodRoadie.java:89)在org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:97)在org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl $ PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:294)在org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl $ PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:127)在org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl $ PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:82)处在org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl $ PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:282)上在org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:87)在org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:50)在org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:207)在org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:146)在org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl $ 1.run(PowerMockJUnit44RunnerDelegateImpl.java:120)在org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34)在org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44)在org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:122)在org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:106)在org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:53)在org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:59)在org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)在org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)在org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:538)在org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:760)在org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:460)在org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206)

junit4 powermock
1个回答
0
投票

这是因为您需要模拟静态和实例调用

@RunWith(PowerMockRunner.class)
@PrepareForTest({IdentityService.class, IdentityActionsCache.class})
public class IdentityServiceTest  {

    @InjectMocks
    IdentityService identityService;

    @Test
    public void getDuplicateCheckNotificationJSONTest() {
        List<Map<String, Object>> result;
        try {
            //Arrange

            //...other members missing

            PowerMockito.mockStatic(ServiceLocator.class);
            when(ServiceLocator.findService("workflowConfigDataService"))
                .thenReturn(workflowConfigDataService);

            IdentityActions identityActions = new IdentityActions();
            IdentityActionsCache cacheMock = mock(IdentityActionsCache.class); //instance mock
            when(cacheMock.getIdentityActionsByName(action)).thenReturn(identityActions);

            PowerMockito.mockStatic(IdentityActionsCache.class);
            when(IdentityActionsCache.getInstance()).thenReturn(cacheMock); //static call returns instance

            //Act
            result = identityService.getDuplicateCheckNotificationJSON(action);

            //Assert
            assertTrue(result.equals(1l));
        } catch (ALNTApplicationException e) {
            assertFalse(false);
        } 
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.