Mockito实体管理器返回namedQuery

时间:2019-02-22 09:41:21

标签: java unit-testing mocking mockito

所以我想标题说明了所有问题,只要有人可以更好地帮助他人告诉我更新标题,那么我在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中得到空指针异常,如何正确模拟实体管理器,以便在创建命名查询时它会返回我想要的东西

2 个答案:

答案 0 :(得分:0)

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

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

当然,entityManager也必须是模拟的。

答案 1 :(得分:0)

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

TypedQuery query = mock(TypedQuery.class);

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