当前位置: 代码迷 >> java >> Mockito实体管理器返回namedQuery
  详细解决方案

Mockito实体管理器返回namedQuery

热度:94   发布时间:2023-08-02 11:11:13.0

所以我想标题说明了所有问题,如果有人可以更好地帮助别人,只是告诉我更新标题,那么我在Mockito中遇到的问题就是我有一个类似

List<TimeZone> timeZones = entityManager
            .createNamedQuery("get.Alltimezone", TimeZone.class).getResultList();

并且我想返回所有时区,但是当我使用模拟创建命名查询时,我得到了空指针异常原因,当调用.getResultList时,我将得到空指针,并且我需要帮助来修复我尝试做的事在我的测试中

        Query query = mock(Query.class);
    when(caseSetTimezone.entityManager.createNamedQuery(anyString())).thenReturn(query);

    List<TimeZone> captureTimezone;
    ArgumentCaptor<TimeZone> argumentCaptor = ArgumentCaptor.forClass(TimeZone.class);
    verify(caseSetTimezone.entityManager , times(1)).persist(argumentCaptor.capture());
    captureTimezone = argumentCaptor.getAllValues();

    assertThat(captureTimezone.get(0).getTimezone()).isEqualTo("Europe/Athens");

但这似乎不起作用,我总是在createNamedQuery中得到空指针异常,我该如何正确模拟实体管理器,以便在创建命名查询时可以返回我想要的内容

这是单参数方法的设置。 您需要的是:

Query query = mock(Query.class);
    when(caseSetTimezone.entityManager
      .createNamedQuery(anyString(), any(Class.class)).thenReturn(query);

当然,entityManager也需要是模拟的。

所以我的问题是我尝试返回查询而不是TypeQuery,所以这可能会帮助某人

TypedQuery query = mock(TypedQuery.class);

    when(caseSetTimezone.entityManager.createNamedQuery("get.Alltimezone" , TimeZone.class)).thenReturn(query);