我有一个从缓存实例中获取数据的函数,我需要对其进行模拟
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)
这是因为您需要模拟静态和实例调用
@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);
}
}
}