Frage

Frühling DA hilft schriftlich DAOs. Wenn iBATIS als Persistenz-Framework verwenden, und ich SqlMapClientDaoSupport sollte ein SqlMapClient Mock für die DAO eingestellt werden, aber ich kann es nicht tun. SqlMapClientTemplate ist keine Schnittstelle und EasyMock kann keine Mock für sie erstellt.

War es hilfreich?

Lösung

DAO und Unit-Tests erhalten nicht gut zusammen! Das macht keinen Sinn, irgendetwas in einer Komponente zu verspotten, die keine Geschäftslogik halten und auf dem Datenbankzugriff konzentriert. Sie sollten versuchen, stattdessen einen Integrationstest zu schreiben. Werfen Sie einen Blick auf die Federreferenzdokumentation, Kapitel 8.3: http: //static.springframework.org/spring/docs/2.5.x/reference/testing.html

Andere Tipps

Der genaue Grund ist, warum ich erstrecken uns nicht von SqlMapClientDaoSupport. Stattdessen spritze ich eine Abhängigkeit der SqlMapClientTemplate (als Schnittstelle SqlMapClientOperations eingegeben). Hier ist ein Spring 2.5 Beispiel:

@Component
public class MyDaoImpl implements MyDao {

    @Autowired
    public SqlMapClientOperations template;

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

Wie @Banengusk vorgeschlagen - kann dies erreicht werden durch Mockito . Allerdings ist es wichtig festzustellen, dass Ihr DAO wird eine Feder SqlMapClientTemplate wird, die Ihren Mock SqlMapClient einwickelt. Infact, SqlMapClientTemplate Delegierten Anrufungen der SqlMapSession in der iBatis Schicht.

Deshalb einige zusätzliche Mock-Setup ist erforderlich:

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);

Wir können dann Verhalten überprüfen wie folgt:

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"));

Versuchen Sie Mockito . Es läßt Mock Klassen, nicht nur Schnittstellen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top