J'ai demandé un question, dont le titre aurait pu être trompeur, donc je vais essayer de poser à nouveau la question avec beaucoup de détails. (Je sais que la question semble longue mais s'il vous plaît ours avec moi)comment tester l'intégration d'un DAO construit avec spring + iBatis
Ce que j'essaie de faire: Je veux simplement écrire un cas de test pour mon DAO et le faire fonctionner. Je sais que mon DAO fonctionne bien à l'intérieur du conteneur (serveur d'applications) mais lorsque j'appelle DAO à partir du cas de test ... cela ne fonctionne pas. Je pense parce que c'est à l'extérieur du conteneur.
Stuff dans mon ressort pour-iBatis.xml
<bean id="IbatisDataSourceOracle" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="jdbc/RSRC/my/db/oltp"/>
</bean>
<bean id="MapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation" value="classpath:sql-map-config-oracle.xml"/>
<property name="dataSource" ref="IbatisDataSourceOracle"/>
</bean>
Stuff dans mon sql-map-config-oracle.xml
<sqlMapConfig>
<settings enhancementEnabled="true" useStatementNamespaces="true" />
<transactionManager type="JDBC">
<dataSource type="JNDI">
<property name="DataSource" value="jdbc/RSRC/my/db/oltp"/>
</dataSource>
</transactionManager>
<sqlMap resource="mymapping.xml"/>
</sqlMapConfig>
ma classe abstraite:
public abstract MyAbstract {
public SqlMapClientTemplate getSqlTempl() SQLException{
public static final String ORCL = "jdbc/RSRC/PIH/eiv/oltp";
try {
ApplicationInitializer.getApplicationContext().getBean("MapClient");
SqlMapClient scl = (SqlMapClient) ApplicationInitializer.getApplicationContext().getBean("MapClient");
DataSource dsc = (DataSource) MyServiceLocator.getInstance().getDataSource(ORCL);
return new SqlMapClientTemplate (dsc, scl);
}
catch (NamingException e)
{
log.error(ne.getMessage(), e);
throw new SQLException("some error here: " + e.getMessage());
}
}
}
mon DAO:
public class MyDAO extends MyAbstract{
public AnObject getSomething(String id)
{
HashMap myMap = new HashMap();
myMap.put("id", id);
try {
setSqlMapClientTemplate(getSqlTempl());
}
catch (SQLException ne)
{
log.error (ne.getMessage(), ne);
}
getSqlMapClientTemplate().queryForList("mymapping.someproc", myMap);
return AnObject ((List)myMap.get("firstresult").get(0));
}
}
Mytests
public class MyDAOTests extends TestCase {
public void testMyDAO()
{
MyDAO myd = new MyDAO();
AnObject ano = myd.getSomething("15");
assertEquals("1500", ano.getContentId());
}
}
J'ai essayé de présenter le problème dans cet extrait de code. Le test échoue car il n'est pas en mesure d'obtenir la connexion à la base de données ... car il est en dehors du conteneur. Je sais que la conception peut être corrigée pour faire un meilleur usage des injections de dépendance. Pouvez-vous me montrer, à partir de cet extrait, quelles améliorations pourraient être apportées pour que les tests puissent fonctionner?
J'ai eu du mal avec cela et j'apprécierais vraiment de l'aide. PS: J'ai dû faire usage de setSqlMapClientTemplate()
parce que je veux appeler à mon DAO pour être simplement simple MyDAO myd = new MyDAO()
Je ne veux pas faire l'interface pour chacun de mon DAO.
Pourquoi votre classe abstraite a-t-elle le nom JNDI câblé dans votre classe abstraite? Juste l'injecter en utilisant le printemps. – duffymo
Cela ressemble à une application écrite pour le printemps par quelqu'un qui ne comprend pas réellement Spring. Je me sens mal pour toi. –
Je me sens mal pour moi-même ... pour ne pas connaître le printemps assez bien pour corriger moi-même ce code. la faute est à moi ... – Drake