【问题标题】:test class getting null values for path and query测试类获取路径和查询的空值
【发布时间】:2016-01-10 14:45:12
【问题描述】:

我正在尝试测试 createQuery db 调用但得到空指针异常

 @Override
    public Member fetchMemberByNetworkId(String networkId) {
        List<Member> memberList = new ArrayList<Member>();
        CriteriaBuilder cb = entityManager.getCriteriaBuilder();
        CriteriaQuery<Member> c = cb.createQuery(Member.class);
        Root<Member> root = c.from(Member.class);
        Expression<String> path = root.get("networkid");
        Expression<String> upper =cb.upper(path);
        Predicate cp = cb.equal(upper, networkId.toUpperCase());
        c.where(cb.and(cp));
        Query query = entityManager.createQuery(c);

           memberList = query.getResultList();


        //List<Member> memberList = query.getResultList();


        if(null != memberList && CollectionUtils.isNotEmpty(memberList)) {
            return memberList.get(0);
        }
        else{
            return new Member() ;
        }
    }




 public class ExperimentBeanTransformerTest {

    //~ Instance fields ------------------------------------------------------------------------------------------------


    ExperimentBeanTransformer experimentBeanTransformer = new ExperimentBeanTransformer();
    @Spy
    @InjectMocks
    UserGroupManagementService memberService = new UserGroupManagementServiceImplementation();

    @Spy
    @InjectMocks
    UserGroupManagementDAO userGroupManagementDAO = new UserGroupManagementDAOImplementation();


    @Mock
    transient  EntityManager entityManager ;
    @Mock
    CriteriaBuilder criteriaBuilder ;
    @Mock
    CriteriaQuery<Member> criteriaQuery;
    @Mock
    Root<Member> root;
    @Mock
    Expression expr;
    @Mock
    Path path;
    @Mock
    Predicate predicate;

    transient Query query = mock(Query.class);
    @Mock
    TypedQuery<Member> querymem;


    //~ Methods --------------------------------------------------------------------------------------------------------

    @BeforeMethod
    public void setUp() {
        MockitoAnnotations.initMocks(this);
    }
  @Test
    public void testfecthFullNameOfUser() {
        String networkId = "network";
        List<Member> members = buildMembersList(5);
        String queryname="Experiment.findCount";
       final List<Member> members2 = new ArrayList<Member>(buildMembersList(5));
        Expression<String> doublePath = root.get(networkId);
        when(entityManager.getCriteriaBuilder()).thenReturn(criteriaBuilder);
        when(criteriaBuilder.createQuery(Member.class)).thenReturn(criteriaQuery);
        when(criteriaQuery.from(Member.class)).thenReturn(root);
        when(root.get((networkId))).thenReturn(doublePath);
        when(criteriaBuilder.upper(root.<String>get("networkid"))).thenReturn(expr);
        when(criteriaBuilder.equal(expr, networkId.toUpperCase())).thenReturn(predicate);

        when(entityManager.createQuery((String) any())).thenReturn( querymem);


        when(query.getResultList()).thenReturn(members2);
        when(memberService.fetchMemberByNetworkId(networkId)).thenReturn(members);
        when(userGroupManagementDAO.fetchMemberByNetworkId(networkId)).thenReturn((Member) members);

        experimentBeanTransformer.fecthFullNameOfUser(networkId);


    }

我得到查询,路径空值。我是否必须实例化 Path,我尝试过但无法为其赋值?如何测试模拟路径(root.get())

【问题讨论】:

    标签: java jpa junit mockito hibernate-entitymanager


    【解决方案1】:

    在 fetchMemberByNetworkId(String networkId) 方法中,您使用字符串文字“networkid”硬编码 root.get() 方法调用。

    表达式路径 = root.get("networkid");

    但是你的测试方法被模拟了

    String networkId = "network";
    when(root.get((networkId))).thenReturn(doublePath);
    

    在您的实现代码中,在调用 root.get 方法时,传递实际的字符串参数 networkId 而不是字符串文字 'networkid'

    public Member fetchMemberByNetworkId(String networkId) {
        // Change as below
        Expression<String> path = root.get(networkId);
    

    观察: 在您的测试代码中,您为 networkId 分配了一个值,并为模拟对象分配了不同的值。

    String networkId = "network";

    // 请检查以下模拟语句。

     when(root.get((networkId))).thenReturn(doublePath);
     when(criteriaBuilder.upper(root.<String>get("networkid"))).thenReturn(expr);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-08
      • 2020-01-05
      • 2023-01-11
      • 2013-03-31
      • 2012-12-28
      • 1970-01-01
      相关资源
      最近更新 更多