2016-07-02 17 views
-1

Ich bin neu in Mockito und versuche, meine Service-Schicht zu testen. Meine DAO-Schicht ist @Autowired im Dienst und Hibernate ist auch autowired. Hibernate wird während des Tests nicht geladen. Ich bekomme immer NullPointerException. Hier ist mein Code:Mockito Test Service Schicht

EmployeeService (Interface)

package com.spring.crud.service; 

import java.util.List; 

import com.spring.crud.entity.Employee; 

public interface EmployeeService { 

    Employee save(Employee employee); 

    boolean update(Employee employee); 

    Employee find(Integer id); 

    List<Employee> getEmployees(); 

    boolean remove(Integer id); 
} 

EmployeeServiceImpl (Klasse)

package com.spring.crud.service; 

import java.util.List; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Service; 

import com.spring.crud.dao.EmployeeDAO; 
import com.spring.crud.entity.Employee; 

@Service 
public class EmployeeServiceImpl implements EmployeeService { 

@Autowired 
private EmployeeDAO dao; 

public Employee save(Employee employee) { 

    return dao.save(employee); 
} 

public boolean update(Employee employee) { 

    return dao.update(employee); 
} 

public Employee find(Integer id) { 

    return dao.find(id); 
} 

public List<Employee> getEmployees() { 

    return dao.getEmployees(); 
} 

public boolean remove(Integer id) { 

    return dao.remove(id); 
} 
} 

EmployeeDAO (Interface)

package com.spring.crud.dao; 

import java.util.List; 

import com.spring.crud.entity.Employee; 

public interface EmployeeDAO { 

Employee save(Employee employee); 

boolean update(Employee employee); 

Employee find(Integer id); 

List<Employee> getEmployees(); 

boolean remove(Integer id); 
} 

EmployeeDAOImpl (Klasse)

package com.spring.crud.dao; 

import java.util.List; 

import javax.transaction.Transactional; 

import org.hibernate.Query; 
import org.hibernate.Session; 
import org.springframework.stereotype.Repository; 

import com.spring.crud.entity.Employee; 

@Transactional 
@Repository 
public class EmployeeDAOImpl extends HibernateUtil implements EmployeeDAO{ 

public Employee save(Employee employee) { 

    Session session = getCurrentSession(); 

    session.save(employee); 

    return employee; 
} 

public boolean update(Employee employee) { 

    Session session = getCurrentSession(); 

    session.update(employee); 

    return false; 
} 

public Employee find(Integer id) { 

    Session session = getCurrentSession(); 

    Employee employee = (Employee)session.get(Employee.class, id); 

    return employee; 
} 

public List<Employee> getEmployees() { 

    Session session = getCurrentSession(); 

    Query query = session.createQuery("from Employee"); 

    @SuppressWarnings("unchecked") 
    List<Employee> employees = (List<Employee>)query.list(); 

    return employees; 
} 

public boolean remove(Integer id) { 

    Session session = getCurrentSession(); 

    Employee employee = (Employee)session.get(Employee.class, id); 

    if(employee!=null){ 

     session.delete(employee); 

     return true; 
    } 

    return false; 
} 
} 

HibernateUtil

package com.spring.crud.dao; 

import javax.annotation.PostConstruct; 

import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.orm.hibernate3.support.HibernateDaoSupport; 

public class HibernateUtil extends HibernateDaoSupport{ 

@Autowired 
private SessionFactory sessionFactory; 

@PostConstruct 
public void init() { 
    setSessionFactory(sessionFactory); 
} 

public Session getCurrentSession() { 
    return sessionFactory.getCurrentSession(); 
} 
} 

EmployeeServiceTest (Test Klasse)

package com.spring.crud.test; 

import static org.junit.Assert.assertNotNull; 
import static org.junit.Assert.assertNull; 
import static org.junit.Assert.assertTrue; 
import static org.mockito.Matchers.any; 
import static org.mockito.Mockito.mock; 
import static org.mockito.Mockito.when; 

import java.util.ArrayList; 
import java.util.Date; 
import java.util.List; 

import org.junit.Before; 
import org.junit.Test; 
import org.mockito.MockitoAnnotations; 
import org.mockito.Spy; 
import org.mockito.invocation.InvocationOnMock; 
import org.mockito.stubbing.Answer; 
import org.springframework.test.context.ContextConfiguration; 

import com.spring.crud.config.WebConfig; 
import com.spring.crud.dao.EmployeeDAO; 
import com.spring.crud.dao.EmployeeDAOImpl; 
import com.spring.crud.entity.Employee; 
import com.spring.crud.service.EmployeeService; 
import com.spring.crud.service.EmployeeServiceImpl; 

@ContextConfiguration(classes = {WebConfig.class}) 
public class EmployeeServiceTest { 

private EmployeeDAO employeeDAO; 

private EmployeeService employeeService = new EmployeeServiceImpl(); 

@Spy 
List<Employee> employees = new ArrayList<Employee>(); 

@Before 
public void setup() { 
    MockitoAnnotations.initMocks(this); 

    employeeDAO = mock(EmployeeDAOImpl.class); 
} 

@Test 
public void listEmployees() { 

} 

@Test 
public void create() { 

    Employee employee = new Employee(); 

    employee.setDateOfBirth(new Date()); 
    employee.setGender("male"); 
    employee.setName("Ashutosh"); 

    when(employeeDAO.save(any(Employee.class))) 
     .thenAnswer(new Answer<Employee>() { 

      public Employee answer(InvocationOnMock invocation) throws Throwable { 

       Employee employee = (Employee) invocation.getArguments()[0]; 

       employee.setId(1); 

       return employee; 
      } 

     }); 

    assertNull(employee.getId()); 

    employee = employeeService.save(employee); 

    assertNotNull(employee.getId()); 

    assertTrue(employee.getId()>0); 
} 

@Test 
public void edit() { 

} 

@Test 
public void update() { 

} 

@Test 
public void remove() { 

} 

} 

Ich kann nicht viel über diese im Internet finden.

+0

Da eine Arbeits Antwort kam von JB Nizet, ich habe anschließend die Änderungen rückgängig gemacht. Bitte ändern Sie Ihre Fragen nicht so, dass vorhandene Antworten ungültig werden. Vielen Dank. – halfer

+0

Darf ich vorschlagen, dass JB Nizets Antwort akzeptiert wird? Um eine Antwort zu akzeptieren, klicken Sie auf das nebenstehende Häkchen, so dass es grün wird. – halfer

Antwort

2

Nur weil Sie ein Pseudo-Mitarbeiter-DAO in Ihrem Test erstellen, heißt das nicht, dass Ihr Dienst es verwenden wird. Es wird nicht. Wenn Sie das tun

new EmployeeServiceImpl(); 

Sie eine Instanz des Dienstes erstellen, und sein DAO-Feld ist nicht initialisiert (so null).

Verwenden Konstruktor Injektion, und übergeben Sie die Mock DAO an den Service-Konstruktor:

public class EmployeeServiceImpl implements EmployeeService { 

    private EmployeeDAO dao; 

    @Autowired 
    public EmployeeServiceImpl(EmployeeDAO dao) { 
     this.dao = dao; 
    } 

    ... 
} 

und/oder zumindest Mockito Annotationen verwenden richtig:

@Mock 
private EmployeeDAO employeeDAO; 

@InjectMocks 
private EmployeeServiceImpl employeeService; 

@Before 
public void setup() { 
    MockitoAnnotations.initMocks(this); 
} 
+0

Hallo JB, machte die vorgeschlagenen Änderungen, aber immer noch "Mitarbeiter" -Objekt als Null nach dem Speichern, danke – Ashutosh

+0

Ich heruntergeladen Ihr Projekt, repariert sein Layout, entfernt die nicht kompilierende DataSource-Initialisierung, kopierte den Code des Tests in Ihrem Frage, fügte den fehlenden Import für Mock hinzu, führte den Test, und es bestanden. Sie führen also wahrscheinlich nicht den Code aus, der in Ihrer Frage enthalten ist. Und jetzt, da du es bearbeitet hast, sieht meine Antwort ganz komisch aus, weil es deine ** anfängliche ** Frage beantwortet hat. –

+0

oops, fühle mich nicht schlecht, wollte nur den Code vervollständigen. Ich habe eine Referenz zu Ihrer Antwort in der Frage hinzugefügt. Da dies mein erster Mockito-Test ist, habe ich wahrscheinlich etwas verpasst. Können Sie bitte den Code, den Sie an Ihrem Ende festgelegt haben, angeben? Vielen Dank – Ashutosh

0

OK, ich einige Korrekturen gefunden und jetzt Der Test läuft.

Zuerst habe ich die HibernateUtil

feste
package com.spring.crud.dao; 

import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.springframework.beans.factory.annotation.Autowired; 

public class HibernateUtil{ 

    @Autowired 
    private SessionFactory sessionFactory; 

    public Session getCurrentSession() { 
     return sessionFactory.getCurrentSession(); 
    } 
} 

Dies ist die EmployeeServiceTest Klasse

package com.spring.crud.test; 

import static org.junit.Assert.assertEquals; 
import static org.junit.Assert.assertNotNull; 
import static org.junit.Assert.assertNull; 
import static org.mockito.Matchers.any; 
import static org.mockito.Mockito.when; 

import java.util.Date; 

import org.junit.Before; 
import org.junit.Test; 
import org.mockito.InjectMocks; 
import org.mockito.Mock; 
import org.mockito.MockitoAnnotations; 
import org.mockito.invocation.InvocationOnMock; 
import org.mockito.stubbing.Answer; 
import org.springframework.test.context.ContextConfiguration; 

import com.spring.crud.config.WebConfig; 
import com.spring.crud.dao.EmployeeDAO; 
import com.spring.crud.entity.Employee; 
import com.spring.crud.service.EmployeeServiceImpl; 

@ContextConfiguration(classes = {WebConfig.class}) 
public class EmployeeServiceTest { 

@Mock 
private EmployeeDAO employeeDAO; 

@InjectMocks 
private EmployeeServiceImpl employeeService; 

@Before 
public void setup() { 
    MockitoAnnotations.initMocks(this); 
} 

@Test 
public void listEmployees() { 

} 

@Test 
public void create() { 

    Employee employee = new Employee(); 

    employee.setDateOfBirth(new Date()); 
    employee.setGender("male"); 
    employee.setName("Ashutosh"); 

    when(employeeDAO.save(any(Employee.class))) 
     .thenAnswer(new Answer<Employee>() { 

      public Employee answer(InvocationOnMock invocation) throws Throwable { 

       Employee employee = (Employee) invocation.getArguments()[0]; 

       employee.setId(10); 

       return employee; 
      } 

     }); 

    assertNull(employee.getId()); 

    employee = employeeService.save(employee); 

    System.out.println("Id = " + employee.getId()); 

    assertNotNull(employee); 

    assertEquals((Integer)10, (Integer)employee.getId()); 
} 

@Test 
public void edit() { 

} 

@Test 
public void update() { 

} 

@Test 
public void remove() { 

} 

} 
Verwandte Themen