2016-04-05 17 views
1

Ich habe die folgenden abgespeckte Klassen (lassen Sie uns so tun, die Service-Schnittstelle hat nur die einzige überschriebene Methode der Einfachheit halber). Egal was ich versuche, bekomme ich immer eine NullPointerException, wenn die ServiceImplgetSqlSession() aufruft. Wie kann ich diesen Aufruf überschreiben, um die Ausnahme zu vermeiden? Ich habe versucht, einen Spion ServiceImpl zu erstellen und when auf der Methode getSqlSession() aufrufen, aber ich bekomme immer noch die Ausnahme. Ich möchte nicht die Logik in ServiceImpl.getData() setzen, die die List<Object> in eine Map<String,Object> in der Testklasse ändert, da, wenn diese Implementierung sich jemals ändert, der Testcode auch geändert werden muss. Irgendwelche Vorschläge?Mockito NullPointerException von Super Class Methode Anruf

public class ServiceImpl extends BaseService implements Service { 

    @Autowired 
    private ServiceDAO serviceDao; 

    @Override 
    public Map<String, Object> getData() { 
     Map<String,Object> map = new HashMap<String,Object>(); 
     List<Object> resultSet = service.getData(getSqlSession()); 
     map.put("Test", resultSet.get(0)); 
     map.put("Test2", resultSet.get(1)); 

     return map; 
    } 

    public void setServiceDao(final ServiceDAO serviceDao) { 
    this.serviceDao = serviceDao; 
    } 

} 

Die BaseService:

public class BaseService { 

    @Autowired 
    private ApplicationContext context; 

    public SqlSession getSqlSession() { 
     return (SqlSession)context.getBean("SQL_SESSION"); 
    } 

    public void setContext(ApplicationContext context) { 
     this.context=context; 
    } 

} 

Die DAO

public class ServiceDAO { 
    public List<Object> getData(SqlSession sqlSession) { 
     return sqlSession.selectList("proc_name"); 
    } 
} 

und die Testklasse:

public class ServiceImplTest { 

    private Service service; 

    @Mock 
    private ServiceDAO serviceDao; 

    @Before 
    public void before() { 
     MockitoAnnotations.initMocks(this); 
     service = new ServiceImpl(); 
     service.serviceDao = this.serviceDao; 
    } 

    @Test 
    public void testGetData() { 
     Mockito.when(service.getData()).then(new Answer<List<Object>>() { 

     @Override 
     public List<Object> answer(InvocationOnMock invocation) throws Throwable { 
      return serviceDAO.getData(new DefaultSqlSession(null,null)); 

     } 

    }); 

     service.getData(); 

    } 
} 
+0

sein kann @Spy Anmerkung helfen –

+0

der Lage war, diese Arbeit zu bekommen endlich einen Spion mit dank – aarbor

+0

Dank froh, dass es –

Antwort

0

endlich in der Lage sind dies mit folgenden Testklasse arbeiten zu erhalten. Musste die Service Deklaration von der Schnittstelle zur tatsächlichen Impl Klasse ändern. Ich bin mir nicht sicher, ob es irgendeinen Weg gibt, da alle anderen Versuche nicht funktioniert haben.

public class ServiceImplTest { 

    @Mock 
    private ServiceDAO serviceDAO; 

    @Spy 
    private ServiceImpl service; 

    @Before 
    public void before() { 
     MockitoAnnotations.initMocks(this); 
     //service = new ServiceImpl(); 
     service.setServiceDAO(this.serviceDAO); 
    } 

    @Test 
    public void testGetData() { 
     Mockito.doAnswer(new Answer<SqlSession>(){ 

      @Override 
      public SqlSession answer(InvocationOnMock invocation) throws Throwable { 
       return new DefaultSqlSession(null,null); 
      } 

     }).when(service).getSqlSession(); 

     Mockito.when(service.getData()).then(new Answer<List<Object>>() { 

     @Override 
     public List<Object> answer(InvocationOnMock invocation) throws Throwable { 
      return serviceDAO.getData(new DefaultSqlSession(null,null)); 

     } 

    }); 

     service.getData(); 

    } 

} 
0

Ich glaube, der Fehler tritt auf, wenn Sie versuchen, die serviceDao zu verwenden von Ihrem Service:

List<Object> resultSet = service.getData(getSqlSession()); 

Sie müssen die verspottete serviceDAO in Ihrem Dienst injizieren, wenn Sie im gleichen Paket sind:

@Before 
public void before() { 
    MockitoAnnotations.initMocks(this); 
    service = new ServiceImpl(); 
    service.service = this.serviceDAO; 
} 
+0

half ich nehme an, Sie bedeutete 'service.serviceDAO = this.serviceDAO;' und ich versuchte, dass auch. Funktioniert nicht. – aarbor

+0

Nein ich meinte "service.service" in Ihrem ServiceImpl das Dao heißt "service", und ich glaube diese Klasse ist null? Wo bekommst du die Ausnahme genau? –

+0

Entschuldigung, Sie haben Recht. Bearbeitete den Code oben, um zu klären, und fügte auch Ihre Änderungen hinzu (um zu zeigen, dass ich das versucht habe). aber für mich bekomme ich immer noch die Ausnahme. Ich bekomme die Ausnahme genau, wo Sie sind, jedes Mal, direkt beim Aufruf von 'service.getData (getSqlSession())' – aarbor

Verwandte Themen