Domanda

Spring DA aiuta a scrivere DAO. Quando si utilizza iBATIS come framework di persistenza e si estende SqlMapClientDaoSupport, è necessario impostare un mock SqlMapClient per DAO, ma non posso farlo. SqlMapClientTemplate non è un'interfaccia e EasyMock non può creare un finto per questo.

È stato utile?

Soluzione

DAO e unit test non vanno d'accordo! Non ha senso deridere qualsiasi cosa in un componente che non detiene alcuna logica aziendale ed è focalizzata sull'accesso al database. Dovresti invece provare a scrivere un test di integrazione. Dai un'occhiata alla documentazione di riferimento di primavera, capitolo 8.3: http: //static.springframework.org/spring/docs/2.5.x/reference/testing.html

Altri suggerimenti

Questo motivo esatto è il motivo per cui non mi estendo da SqlMapClientDaoSupport . Invece, inserisco una dipendenza nel SqlMapClientTemplate (digitato come interfaccia SqlMapClientOperations ). Ecco un esempio di Spring 2.5:

@Component
public class MyDaoImpl implements MyDao {

    @Autowired
    public SqlMapClientOperations template;

    public void myDaoMethod(BigInteger id) {
        int rowcount = template.update("ibatisOperationName", id);
    }
}

Come suggerito da @Banengusk, questo può essere ottenuto con Mockito . Tuttavia, è importante stabilire che il tuo DAO utilizzerà un SqlMapClientTemplate Spring che avvolge il tuo SqlMapClient . Infatti, SqlMapClientTemplate delega le invocazioni al SqlMapSession nel livello IBatis.

Pertanto è necessaria un'ulteriore configurazione fittizia:

mockSqlMapSession = mock(SqlMapSession.class);
mockDataSource = mock(DataSource.class);

mockSqlMapClient = mock(SqlMapClient.class);
when(mockSqlMapClient.openSession()).thenReturn(mockSqlMapSession);
when(mockSqlMapClient.getDataSource()).thenReturn(mockDataSource);

dao = new MyDao();
dao.setSqlMapClient(mockSqlMapClient);

Possiamo quindi verificare il comportamento in questo modo:

Entity entity = new EntityImpl(4, "someField");
dao.save(entity);

ArgumentCaptor<Map> params = ArgumentCaptor.forClass(Map.class);
verify(mockSqlMapSession).insert(eq("insertEntity"), params.capture());
assertEquals(3, params.getValue().size());
assertEquals(Integer.valueOf(4), params.getValue().get("id"));
assertEquals("someField", params.getValue().get("name"));
assertNull(params.getValue().get("message"));

Prova Mockito . Permette classi simulate, non solo interfacce.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top