2014-09-28 10 views
0

У меня есть 2 метода, первый метод в классе jpa для поиска id и другой метод для создания записи (которая проверяет, существует ли идентификатор уже и создает ли запись, если запись с идентификатором не существует).Mock внутренний метод с JUnit и Mockito

public class EmployeeRegistry{ 
public Employee findEmployeeById(String empid){ 
    List<Employee> results = new ArrayList<Employee>(); 
    final Query query = entityManager.createNamedQuery("employeeRegistryImpl.findByEmployeeId"); 
    query.setParameter("empid", empid); 

    results = (List<Employee>) query.getResultList(); 

    if (CollectionUtils.isEmpty(results)) {    
     return null; 
    } 
    return results.get(0); 
} 

public Employee createEmployee(final Employee employee) throws PersistenceException{ 
    if ((findEmployeeById(employee.getId()!=null)) { 
     throw new EntityExistsException(); 
    } 
    return entitytManager.merge(employee); 
} 
} 

Я написал тестовые случаи с JUnit и Mockito рамок для первого метода, findEmployeeById. например,

@RunWith(MockitoJUnitRunner.class) 
public class EmployeeRegistryImplTest{ 

private String empid = "empid"; 

@Mock 
private static EntityManager entityManager; 
@Mock 
private static Query query; 

@InjectMocks 
private static EmployeeRegistry employeeRegistryImpl; 

@Test 
public void findEmployeeByIdReturnsNull() { 

    final List<Employee> employees = new ArrayList<Employee>(); 

    // given 
given(entityManager.createNamedQuery("employeeRegistryImpl.findByEmployeeId")).willReturn(query); 
given(query.setParameter("empid", empid)).willReturn(query); 
given(query.getResultList()).willReturn(employees); 

// when 
Employee employeeResult = null; 
employeeResult = employeeRegistryImpl.findEmployeeById(empid); 

// then 
assertNull(employeeResult); 
verify(entityManager, Mockito.times(1)).createNamedQuery 
("employeeRegistryImpl.findEmployeeById"); 
} 

Я попытался написать тестовый пример для CreateEmployee

@Test 
public void createEmployeeReturnsNotNull() {  
    final Employee employee= new Employee(); 

    // when 
    Employee employee= null; 
    employeeResult = employeeRegistryImpl.createEmployee(employee); 

    assertNotNull(employeeResult); 
} 

Поскольку метод CreateEmployee вызывает внутренне findEmployeeById и получите NullPointerException, как я могу дразнить findEmployeeById (и EmpId в качестве вклада тот же метод) для метода createEmployee в моем тестовом классе EmployeeRegistryTest.

- Добавлено шпионаж после проверки шпиона из документации Mockito и получает NullPointerException для empid.

@Test 
public void createEmployeeReturnsNotNull() { 
final Employee employee = new Employee(); 
employee.setEmpId(empid); 
final Employee employee2 = new Employee(); 
employee2.setEmpId(empid); 
EmployeeRegistryImpl spy = Mockito.spy(employeeRegistryImpl); 

    // when 
    Employee employeeResult = null; 
    try { 
     doReturn(employee2).when(spy).findEmployeeById(empid); 
     employeeResult = employeeRegistryImpl 
       .createUser(employee); 

        // then 
     verify(spy).findEmployeeById(empid); 

     assertNotNull(employeeResult); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
} 

-- Exception after spying 
java.lang.NullPointerException 
    at EmployeeRegistryImpl.findEmployeeById(EmployeeRegistryImpl.java:) 
    at EmployeeRegistryImpl.createEmployee(EmployeeRegistryImpl.java:) 
    at EmployeeRegistryImplTest.createEmployeeReturnsNotNull(EmployeeRegistryImplTest.java:) 
+0

Прочтите главы 13 и 16 http://docs.mockito.googlecode.com/hg/latest/org/mockito/Mockito.html. Пока вы на нем, прочитайте все остальные. –

+0

Спасибо! что дало мне представление о шпионаже объекта. Поэтому я добавил шпионаж в свой отредактированный пост и получил NullPointerException. – user3587174

+0

Непонятно, где вы получаете исключение - всегда указывайте ошибки, которые вы пытаетесь исправить. Это может быть связано с тем фактом, что вы возвращаете «null» в свой издеваемый метод. – vanza

ответ

0

- ответы размещены ниже

я узнал, что я на самом деле не нужно, чтобы шпионить, я могу просто издеваются внутренний метод, а также и что работает :)

например,

@Test 
public void createEmployeeThrowsExceptionWhenEmployeeExists() { 
final Employee employee= new Employee();  
employee.setEmpId(empId); 

final List<Employee> employeeList = new ArrayList<Employee>(); 
employeeList.add(new employee()); 

// given 
given(entityManager.createNamedQuery("employeeRegistryImpl.findByEmployeeId")).willReturn(query); 
given(query.setParameter("empId", empId)).willReturn(query); 
given(query.getResultList()).willReturn(employeeList); 

// when 
try { 
    employeeRegistryImpl.createUser(employeeList);  
} catch (Exception e) { 
// then 
    e.getErrorCode()); 
} 

// then 
verify(entityManager, Mockito.times(1)). 
createNamedQuery("employeeRegistryImpl.findByEmployeeId"); 
} 
0

Вы можете создать новый внутренний класс в TestCase расширяет EmployeeRegistry и метод коррекции «findEmployeeById» и называет «CreateEmployee» нового класса.

Смежные вопросы