كيفية اختبار الوحدة لـ DAO الذي يقوم بتوسيع SqlMapClientDaoSupport
سؤال
يساعد Spring DA في كتابة DAOs.عند استخدام iBATIS كإطار عمل للاستمرار وتوسيع SqlMapClientDaoSupport، يجب تعيين نموذج SqlMapClient لـ DAO، لكن لا يمكنني القيام بذلك.SqlMapClientTemplate ليس واجهة ولا يمكن لـ EasyMock إنشاء نسخة وهمية لها.
المحلول
DAO واختبارات الوحدة لا تتوافقان بشكل جيد!ليس من المنطقي الاستهزاء بأي شيء في مكون لا يحتوي على أي منطق عمل ويركز على الوصول إلى قاعدة البيانات.يجب أن تحاول بدلاً من ذلك كتابة اختبار التكامل.ألق نظرة على الوثائق المرجعية الربيعية، الفصل 8.3: http://static.springframework.org/spring/docs/2.5.x/reference/testing.html
نصائح أخرى
هذا السبب الدقيق هو السبب في أنني لا أمتد من SqlMapClientDaoSupport
.بدلاً من ذلك، أقوم بإدخال تبعية إلى SqlMapClientTemplate
(مكتوبة كواجهة SqlMapClientOperations
).إليك مثال الربيع 2.5:
@Component
public class MyDaoImpl implements MyDao {
@Autowired
public SqlMapClientOperations template;
public void myDaoMethod(BigInteger id) {
int rowcount = template.update("ibatisOperationName", id);
}
}
كما اقترحBanengusk - يمكن تحقيق ذلك باستخدام موكيتو.ومع ذلك، من المهم التأكد من أن DAO الخاص بك سيستخدم Spring SqlMapClientTemplate
الذي يلف وهمية الخاص بك SqlMapClient
.في الحقيقة، SqlMapClientTemplate
مندوب الدعوات إلى SqlMapSession
في طبقة إيباتيس.
لذلك، هناك حاجة إلى بعض عمليات الإعداد الوهمية الإضافية:
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);
يمكننا بعد ذلك التحقق من السلوك مثل هذا:
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"));
يحاول موكيتو.فهو يسمح بفئات وهمية، وليس فقط الواجهات.