У меня есть 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:)
Прочтите главы 13 и 16 http://docs.mockito.googlecode.com/hg/latest/org/mockito/Mockito.html. Пока вы на нем, прочитайте все остальные. –
Спасибо! что дало мне представление о шпионаже объекта. Поэтому я добавил шпионаж в свой отредактированный пост и получил NullPointerException. – user3587174
Непонятно, где вы получаете исключение - всегда указывайте ошибки, которые вы пытаетесь исправить. Это может быть связано с тем фактом, что вы возвращаете «null» в свой издеваемый метод. – vanza