2015-10-13 1 views
0

Я пытаюсь проверить CreateQuery дб вызов, но получение исключения нулевого указателятестовый класс получает нулевые значения пути и запроса

@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())?

ответ

0

В способе fetchMemberByNetworkId (String networkId) у вас есть метод hardcoded root.get() с строковым литералом «networkid».

Путь к выражению = root.get ("networkid");

Но Ваш метод испытания издевались с

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

В вашем коде реализации, при вызове метода root.get, передать фактический аргумент типа String NETWORKID вместо строкового литерала 'NETWORKID'

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

Наблюдение: В вашем тестовом коде вы присвоили networkId одним значением и насмешливыми объектами с разными значениями.

Строка networkId = "network";

// Пожалуйста, ознакомьтесь с приведенными ниже инструкциями.

when(root.get((networkId))).thenReturn(doublePath); 
when(criteriaBuilder.upper(root.<String>get("networkid"))).thenReturn(expr); 
Смежные вопросы