كيفية اختبار الوحدة لـ DAO الذي يقوم بتوسيع SqlMapClientDaoSupport

StackOverflow https://stackoverflow.com/questions/110592

  •  02-07-2019
  •  | 
  •  

سؤال

يساعد 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"));

يحاول موكيتو.فهو يسمح بفئات وهمية، وليس فقط الواجهات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top