2016-04-21 8 views
0

Ich habe eine etwas komplizierte Prozedur, die ich versuche zu testen. getDatesMi ruft eine Methode in derselben Klasse auf. Diese Methode führt einen Aufruf zu einer Schnittstellenmethode aus, die das Ergebnis einer Abfrage, die in einem MarketLimits-Typ umgewandelt wird, zurückgibt.Wie Mock-Klassen, die in der Testklasse mit EasyMock instanziiert werden?

Ich benutze EasyMock und Junit.

Meine Fragen sind:

  1. wie kann ich testen getSqlMapClientTemplate() queryForObject.?
  2. Wie verspotten ich, dass das Ergebnis getSqlMapClientTemplate(). QueryForObject zu MarketLimits gegossen

Ich bin neu in Java und EasyMock so vielleicht die Antwort obviuos aber jede Hilfe sehr geschätzt wird.

Ich bin derzeit immer Nullpointer auf subDates.greaterThenOne()

Schnittstelle für MyServiceDao

import com.foo.bar.domain.MarketLimits; 

public interface MyServiceDao { 
    public MarketLimits getDates(long orgId) throws DataAccessException; 
} 

Klasse, die MyServiceDao implementiert

import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport; 
import com.foo.bar.domain.MarketLimits; 


public class myServiceImpl implements MyServiceDao{ 

    @Override 
    public MarketLimits getDates(long orgId) throws DataAccessException { 
     return (MarketLimits) getSqlMapClientTemplate().queryForObject("retrieveLimits", orgId); 
    } 

}

Hauptklasse zu test

import com.foo.bar.dao.MyServiceDao; 

public class myServiceImpl extends reports implements myService { 

    @Autowired 
    private MyServiceDao myServiceDao; 


    public String getDatesMi() throws Exception { 
     MarketLimits subDates = getDates(23); 

     System.out.print(subDates); // this prints out null 

     if(subDates.greaterThenOne()){ 
      // do some things 
     } 

     return "result" 
    } 


    @Override 
    public MarketLimits getDates(long orgId) { 
     return myServiceDao.getDates(orgId); 
    } 


    public setMyServiceDao(MyServiceDao myServiceDao){ 
     this.myServiceDao = myServiceDao 
    } 

} 

MyTest

@RunWith(EasyMockRunner.class) 
public class myServiceImplTest { 

    @org.easymock.Mock 
    private MyServiceDao myServiceDao; 

    @TestSubject 
    private MyServiceImpl myServiceImpl = new MyServiceImpl(); 

    @Test 
    public void testGetDatesMi() throws Exception { 

     MarketLimits limits = new MarketLimits(); 
     limits.greaterThenOne(true); 
     expect(myServiceDao.getDates()).andReturn(limits); 
     replay(myServiceDao); 

     myServiceImpl.getDatesMi(12); 

    } 
} 

UPDATE 1

Für einige der EasyMock Instanz myServiceDao Grund jedoch erzeugt wurde, als ein Verfahren, war rief die Ea an syMock-Instanz würde NULL zurückgeben. Meine Lösung dazu war, eine Setter-Methode auf myServiceImpl zu erstellen, um meinen myServiceDao-Mock zu setzen. Dies war ein Vorschlag von Deendayal Garg

UPDATE 2

Stellt sich heraus, ich brauche keinen Setter haben =) ich den Titel, um das eigentliche Problem zu reflektieren änderte es gegenüberstand.

+0

Ich aktualisierte die Frage mit dem Null-Fehler passiert – mattwilsn

Antwort

1

Ok. Um eine vollständigere Antwort zu geben, habe ich Ihren Code ausprobiert.Es gibt viele Inkonsistenzen zwischen den Klassen. Ich habe sie so gut wie möglich korrigiert und hier ist ein funktionierendes Beispiel. Wie Sie sehen werden, wird kein Setzer benötigt, um den Dao zu injizieren.

+0

anzurufen Danke für den Vorschlag, aber das Verify gibt diesen Fehler zurück java.lang.IllegalStateException: Das Aufrufen von Verify ist im Datensatzstatus bei org.easymock.internal.MocksControl.verify (MocksControl. java: 223) \t bei org.easymock.EasyMock.verify (EasyMock.java:2007) – mattwilsn

+0

Arg ... Entschuldigung. Es sollte "Replay" gewesen sein – Henri

+0

Danke das ist großartig. – mattwilsn

0

Da Sie MyServiceImpl testen, können Sie myServiceDao vollständig vortäuschen. Sie müssen einen Setter für myServiceDao in MyServiceImpl Klasse haben. Dies ist Mockito spefici, aber auch in EasyMock.

In der Testklasse können Sie etwas wie unten tun.

@Test 
public void testGetDatesMi() throws Exception { 
    myServiceImpl.setMyServiceDao(myServiceDao);// this is mock 
    when(myServiceDao.getDates(anyLong()).thenReturn(mockMarketLimits); 

    // call you method here 

    // verify 
} 
+0

Dies ist die Mockito-Syntax. Und Sie müssen den Spott nicht einstellen. Es wird automatisch vom Läufer durchgeführt. – Henri

+0

Ja. Das habe ich bereits in der Antwort gesagt. –

+0

Ja. Aber es gibt auch keinen Grund, den Setter – Henri