当前位置: 首页 > 知识库问答 >
问题:

带PowerMockRunner的静态函数

有凯泽
2023-03-14

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

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;
}

JUnit与powermock

@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(操作)获取空指针

JAVAcom上的lang.NullPointerException。alnt公司。idm。使用者身份服务。IdentityService测试。sun上的getDuplicateCheckNotificationJSONTest(IdentityServiceTest.java:70)。反映NativeMethodAccessorImpl。在sun调用0(本机方法)。反映NativeMethodAccessorImpl。在sun调用(未知源)。反映DelegatingMethodAccessorImpl。在java上调用(未知源)。lang.reflect。方法在组织中调用(未知源)。朱尼特。内部的跑步者。测试方法。在org调用(TestMethod.java:68)。powermock。模块。junit4。内部的实施。PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner。org上的runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:310)。朱尼特。内部的跑步者。MethodRoadie 2美元。在org上运行(MethodRoadie.java:89)。朱尼特。内部的跑步者。MethodRoadie。在org上运行beforesthentestthenauts(MethodRoadie.java:97)。powermock。模块。junit4。内部的实施。PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner。org上的executeTest(PowerMockJUnit44RunnerDelegateImpl.java:294)。powermock。模块。junit4。内部的实施。PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner。org上的ExecuteTestinsteSuper(PowerMockJUnit47RunnerDelegateImpl.java:127)。powermock。模块。junit4。内部的实施。PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner。org上的executeTest(PowerMockJUnit47RunnerDelegateImpl.java:82)。powermock。模块。junit4。内部的实施。PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner。在org上运行beforesthentestthenurts(powermockjunit44runnerdelegateinpl.java:282)。朱尼特。内部的跑步者。MethodRoadie。在org上运行测试(MethodRoadie.java:87)。朱尼特。内部的跑步者。MethodRoadie。在org上运行(MethodRoadie.java:50)。powermock。模块。junit4。内部的实施。PowerMockJUnit44RunnerDelegateImpl。org上的invokeTestMethod(powermockjunit44runnerdelegatepimpl.java:207)。powermock。模块。junit4。内部的实施。PowerMockJUnit44RunnerDelegateImpl。org上的runMethods(PowerMockJUnit44RunnerDelegateImpl.java:146)。powermock。模块。junit4。内部的实施。PowerMockJUnit44RunnerDelegateImpl 1美元。在org上运行(PowerMockJUnit44RunnerDelegateImpl.java:120)。朱尼特。内部的跑步者。ClassRoadie。org上的runUnprotected(ClassRoadie.java:34)。朱尼特。内部的跑步者。ClassRoadie。org上的runProtected(ClassRoadie.java:44)。powermock。模块。junit4。内部的实施。PowerMockJUnit44RunnerDelegateImpl。在org上运行(PowerMockJUnit44RunnerDelegateImpl.java:122)。powermock。模块。junit4。常见的内部的实施。JUnit4TestSuiteChunkerImpl。在org上运行(JUnit4TestSuiteChunkerImpl.java:106)。powermock。模块。junit4。常见的内部的实施。AbstractCommonPowerMockRunner。在org上运行(AbstractCommonPowerMockRunner.java:53)。powermock。模块。junit4。PowerMockRunner。在org上运行(PowerMockRunner.java:59)。日食jdt。内部的junit4。跑步者JUnit4TestReference。在org上运行(JUnit4TestReference.java:86)。日食jdt。内部的朱尼特。跑步者测试执行。在org上运行(TestExecution.java:38)。日食jdt。内部的朱尼特。跑步者RemoteTestRunner。在org上运行测试(RemoteTestRunner.java:538)。日食jdt。内部的朱尼特。跑步者RemoteTestRunner。在org上运行测试(RemoteTestRunner.java:760)。日食jdt。内部的朱尼特。跑步者RemoteTestRunner。在org上运行(RemoteTestRunner.java:460)。日食jdt。内部的朱尼特。跑步者RemoteTestRunner。main(RemoteTestRunner.java:206)

共有1个答案

贺博厚
2023-03-14

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

@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);
        } 
    }
}
 类似资料:
  • 问题内容: 这三种方法(都用于将一个数组转换为另一个数组)之间的性能差异(如果有)是什么? 使用 使用和λ/关闭功能 使用带有“静态”函数/方法 还有其他方法吗? 为了使自己清楚,让我们看一下这些示例,它们都做同样的事情-将数字数组乘以10: 佛瑞奇 带有lambda的地图 具有“静态”功能的地图,作为字符串引用传递 还有其他方法吗?我将很高兴听到上面案例之间的 所有 实际差异,以及为什么要使用一

  • null 还有其他办法吗?我将很高兴听到实际所有的差异之间的情况从上面,以及任何输入为什么应该使用一个而不是其他。

  • 我找不到和之间的任何区别。据我所知,类静态函数不能被继承,struct也没有继承的选项。 请不要被类中的静态函数和类函数所混淆。 VS

  • 问题内容: 我对php中的静态功能有疑问。 假设我有一堂课 如果我这样做的话,没有问题。 也可以。 头等舱和二等舱有什么区别? 静态函数有什么特别之处? 问题答案: 在第一个类中,实际上是一个实例方法,您将其作为静态方法进行调用,但由于从未引用,所以您将其取消。 静态函数与该类相关联,而不是该类的实例。因此,在静态上下文中不可用(未指向任何对象)。

  • 问题内容: 按照标准书,构造函数是用于初始化对象的一种特殊类型的函数。由于构造函数被定义为一个函数,并且内部类函数只能具有两种类型的静态或非静态类型。我怀疑是什么构造函数? 我的疑问是如果构造函数是静态方法,那么我们如何在构造函数内部频繁使用此方法 输出是否意味着构造函数是非静态的? 问题答案: 您的第二个例子很重要。引用在构造函数中可用,这意味着构造函数是针对某个对象(当前正在创建的对象)执行的

  • 问题内容: 这些对象调用之间有什么区别? 非静态: 静态的: 而且在内部为什么还要对函数使用static属性? 例: 问题答案: 静态函数,根据定义,不能也不依赖于该类的任何实例属性。也就是说,它们不需要类的实例来执行(因此,可以如您所显示的那样执行,而无需先创建实例)。从某种意义上讲,这意味着该函数不必(也永远不需要)依赖于类的成员或方法(公共或私有)。