
ǰÑÔ
ÒѾһ¸öÔÂûдÎÄÕÂÁË£¬ÓÉÓÚ9Ô·ÝÔÚplan¹úÇìÂÃÐмƻ®£¬¹úÇìǰǰºóºóÈ¥ÁË14ÌìÂÃÐУ¬ËùÒÔûʱ¼äд£¬¹þ¹þ¡£
ÑÔ¹éÕý´«£¬ÉÏһƪÎÄÕ¡¶Androidµ¥Ôª²âÊÔ - ÈçºÎ¿ªÊ¼?¡·½éÉÜÁ˼¸¿îµ¥Ôª²âÊÔ¿ò¼Ü¡¢Junit & Mockito»ù±¾Ó÷¨¡¢ÒÀÀµ¸ôÀë & Mock¸ÅÄ±¾ÆªÖ÷Òª½â´ðµ¥Ôª²âÊÔÖм¸¸öÖØÒªÎÊÌâ¡£
ÔÚµ¥Ôª²âÊÔ½»Á÷΢ÐÅȺ£¬ºÜ¶àнøÀ´µÄС»ï°é£¬¶¼»á¼¸¸ö´óͬСÒìµÄÎÊÌâ¡£ÎÒÃǼ¸¸öÀÏÄñÃÇ´ðÍêÒ»´ÎÓÖÒ»´Î(ºñÑÕÎ޳ܵذÑ×Ô¼ºËãÉÏ^_^)£¬±ÊÕßÊÇÓе㲻ÄÍ·³ÁË£¬ºóÀ´¾ÍµÈÆäËûͬѧ»Ø´ðËûÃÇ.....Æäʵ´ó¼ÒÌáµÄÎÊÌ⣬¹é¸ùµ½µ×¾ÍÊÇ¡°ÒÀÀµÎÊÌ⡱£¬jvmÒÀÀµ»¹ÊÇandroidÒÀÀµ?Óõ½native·½·¨±¨´íÔõô°ì?¾²Ì¬·½·¨Ôõô½â¾ö?
ÓÚÊÇÄØ£¬±ÊÕß¾ö¶¨×¨ÃÅдһƪÎÄÕ£¬À´½²½âÕ⼸¸öÎÊÌâ¡£
ÈçºÎ½â¾öAndroidÒÀÀµ?
¸ôÀëNative·½·¨
½â¾öÄÚ²¿new¶ÔÏó
¾²Ì¬·½·¨
RxJavaÒ첽תͬ²½
1.ÈçºÎ½â¾öAndroidÒÀÀµ?
С°×£º¡°PresenterÖÐÓõ½TextUtils£¬ÔËÐÐjunitʱ±¨'java.lang.RuntimeException: Method isEmpty in android.text.TextUtils not mocked'´íÎó... ÊDz»ÊÇÒªÓÃrobolectric?¡±

±ð¼±£¬»¹Î´µ½robolectric³ö³¡µÄʱºòÄØ!
ÓÉÓÚjunitÔËÐÐÔÚjvmÉÏ£¬¶øjdkûÓÐandroidÔ´Â룬ËùÒÔTextUtilsÕâЩÔÚandroid sdkÖеÄÀ࣬ÔËÐÐjunitʱ¾ÍÒýÓò»ÉÏÁË¡£¼ÈÈ»jdkûÓУ¬ÎÒÃǾÍ×Ô¼º¼ÓßÂ!
ÔÚtest/javaĿ¼Ï£¬´´½¨android.text.TextUtilsÀà


¹Ø¼üÊÇÒª¸öTextUtilsͬ°üÃû¡¢Í¬ÀàÃû¡¢Í¬·½·¨Ãû¡£×¢Òâ²»ÊÇÔÚmain/javaÏ´´½¨£¬²»È»»áÌáʾDuplicate class found in the file...¡£µ¥Ôª²âÊÔÔËÐÐÍ×Í׵ģº

ÔÀíºÜ¼òµ¥£¬jvmÔËÐÐʱ»áÕÒandroid.text.TextUtilsÀ࣬ȻºóÕÒisEmpty·½·¨Ö´ÐС£Ñ§¹ýjava·´ÉäµÄͬѧ¶¼ÖªµÀ£¬Ö»ÒªÖªµÀ°üÃûÀàÃû£¬¾Í¿ÉÒÔÄõ½Class£¬ÖªµÀ¸ÃÀàij·½·¨Ãû£¬¾Í¿ÉÒÔ»ñÈ¡Method²¢Ö´ÐС£jvmÒ²ÊÇÀàËÆµÄ»úÖÆ£¬Ö»ÒªÎÒÃǸøÒ»¸ö°üÃûÀàÃûÓëandroid sdkÏàͬµÄÀ࣬дÉÏ·½·¨Ãû&²ÎÊý&·µ»ØÖµÏàͬµÄ·½·¨£¬jvm¾ÍÄܱàÒë²¢Ö´ÐС£
(Ìáʾ£ºandroidµÄViewÖ®ÀàÒ²ÄÜÕâô¸ãàÞ)
2.¸ôÀëNative·½·¨
С°×£º¡°ÎÒÓõ½native·½·¨£¬junitÔËÐÐʧ°Ü£¬robolectricÒ²²»Ö§³Ö¼ÓÔØsoÎļþ£¬Ôõô°ì?¡±
ModelÀࣺ

µ¥Ôª²âÊÔ£º

run ModelTest... ±¨´íjava.lang.UnsatisfiedLinkError: com.test.unit.Model.nativeMethod()
ÉÏÆªÎÄÕ¡¶Androidµ¥Ôª²âÊÔ - ÈçºÎ¿ªÊ¼?¡·½²ÊöµÄ¡°ÒÀÀµ¸ôÀ롱£¬ÕâÀïÒªÓõ½ÁË!

¸Ä½øµ¥Ôª²âÊÔ£º

ÔÙrunһϣ¬passÁË£º

ÕâÀïÉÔ΢½²½²java²éÕÒnative·½·¨µÄ¹ý³Ì£º
1).Model.javaÈ«ÃûÊÇcom.test.unit.Model.java;
2).µ÷ÓÃnative·½·¨nativeMethod()ºó£¬ jvm»áÈ¥ÕÒC++²ãcom_test_unit_Model.cpp£¬ÔÙÕÒcom_test_unit_Model_nativeMethod()·½·¨£¬²¢µ÷Óá£
ÔÚAPPÔËÐйý³Ì£¬ÎÒÃÇ»á°Ñcpp±àÒë³ÉsoÎļþ£¬È»ºóÈÃAPP¼ÓÔØµ½dalvikÐéÄâ»ú¡£µ«ÔÚµ¥Ôª²âÊÔÖУ¬Ã»ÓмÓÔØ¶ÔÓ¦µÄsoÎļþ£¬Ò²Ã»ÓбàÒëcppѽ!´óÅ£ÃÇ¿ÉÄ᳢ܻÊÔµ¥Ôª²âÊÔʱ¼ÓÔØsoÎļþ£¬µ«ÍêȫûÓбØÒª£¬Ò²²»·ûºÏµ¥Ôª²âÊÔµÄÔÔò¡£
ËùÒÔ£¬ÎÒÃÇ¿ÉÒÔÖ±½ÓÓÃMockito¿ò¼Ümock native·½·¨¾ÍÐÐÀ²¡£Êµ¼ÊÉÏ£¬²»½ö½öÊÇnative·½·¨ÐèÒªmock£¬ºÜ¶àÒÀÀµµÄ·½·¨¡¢Àà¶¼Òªmock£¬ÏÂÃæ»á½²µ½¸ü³£Óõij¡¾°¡£
(²Î¿¼¡¶Android JNIÔÀí·ÖÎö¡·)
3.½â¾öÄÚ²¿new¶ÔÏó
С°×£º¡°ÎÒÔÚPresenterÀïnew Model£¬ModelÒÀÀµ±È½Ï¶à£¬»á×ösql²Ù×÷£¬µÈµÈ.....PresenterÒÀÀµModel·µ»Ø½á¹û£¬µ¼ÖÂPresenterû·¨µ¥Ôª²âÊÔÀ²!Çó´óÉñÖ¸µã!¡±
С°×CµÄÀý×Ó£ºModel£º

Presenter£º

´íÎóµÄµ¥Ôª²âÊÔ£º

»¹ÊÇÄǾ仰£ºÒÀÀµ¸ôÀë¡£ÎÒÃǸôÀëModelÒÀÀµ£¬¼´mock Model¶ÔÏ󣬶ø²»ÊÇnew Model()¡£
ÕÒÕÒÒÔÉÏPresenterTestµÄÎÊÌâ°É£ºPresenterTestÍêÈ«²»ÖªµÀModelµÄ´æÔÚ£¬Òâ˼ÊÇÎÞ·¨mock Model¡£ÄÇô£¬ÎÒÃǾÍÏë°ì·¨°Ñmock Model´«¸øPresenter¡ª¡ªÔÚPresenter¹¹Ô캯Êý´«²Î!
¸Ä½øPresenter£º

ÕýÈ·µÄµ¥Ôª²âÊÔ£º

ÊÂÇé¾ÍÕâô½â¾öÁË¡£Èç¹ûÄã¾õµÃÔÚActivityÖ±½ÓÓÃĬÈÏPresenter¹¹Ô캯Êý£¬ÔÚ¹¹Ô캯Êýnew Model()±È½Ï·½±ã£¬ÄǾͱ£ÁôĬÈϹ¹Ô캯Êýß¡£µ±È»Ê¹ÓÃdagger2¾Í²»´æÔÚ¶à¸ö¹¹Ô캯ÊýÁË£¬¶¼Êǹ¹Ôì´«²Î¡£
4.¾²Ì¬·½·¨
С°×£º¡°´óÉñ£¬ÎÒÔÚPresenterÓõ½¾²Ì¬·½·¨....¡±±ÊÕߣº¡°ÐÐÁË£¬ÖªµÀÄãҪ˵ʲô¡£¡±

½â¾ö·½·¨¸úÉÏÃæ¡¾½â¾öÄÚ²¿new¶ÔÏó¡¿´óͬСÒ죬ºËÐÄ˼Ï뻹ÊÇÒÀÀµ¸ôÀë¡£
1).°Ñsign(...)¸Ä³É·Ç¾²Ì¬·½·¨;
2).°ÑSignatureUtils×÷Ϊ³ÉÔ±±äÁ¿;
3).¹¹Ôì·½·¨´«ÈëSignatureUtils;
4).µ¥Ôª²âÊÔʱ£¬°Ñmock SignatureUtils´«¸øPresenter¡£
¸Ä½øºóPresenter£º

5.RxJavaÒ첽תͬ²½
С°×£º¡°´óÉñ...¡±
±ÊÕߣº¡°ÎªÊ¦ÆþÖ¸Ò»Ë㣬ÁÏÈê»áÓö´Ë½ÙÄÑ¡£¡±
С°×£º(´«ËµÖдÓÈëÃŵ½³ö¼Ò?)

µ¥Ôª²âÊÔ

ÔËÐÐRxPresenterTest£º

Äã»á·¢ÏÖûÓÐÊä³ö"test"£¬ÎªÊ²Ã´ÄØ?
ÓÉÓÚtestRxJavaÀïÃæ£¬Obserable.subscribeOn(Schedulers.io())°ÑÏß³ÌÇл»µ½ioỊ̈߳¬²¢ÇÒdelayÁË1Ã룬¶øtestTestRxJava()µ¥Ôª²âÊÔÔçÒÑÔÚµ±Ç°Ïß³ÌÅÜÍêÁË¡£±ÊÕßÊÔ¹ý£¬¼´Ê¹È¥µôdelay(1, TimeUnit.SECONDS)£¬»¹ÊDz»»áÊä³ö¡®test¡¯¡£
¿ÉÒÔ¿´µ½±ÊÕß°Ñ.observeOn(AndroidSchedulers.mainThread())×¢Ê͵ôÁË£¬ÎÒÃǰÑÄǾä´úÂë¼ÓÉÏ£¬ÔÙÅÜÒ»ÏÂtestTestRxJava()£¬»á±¨java.lang.RuntimeException: Method getMainLooper in android.os.Looper not mocked.£º

ÕâÊÇÓÉÓÚjdkûÓÐandroid.os.LooperÕâ¸öÀ༰Ïà¹ØÒÀÀµ¡£
½â¾öÒÔÉÏÁ½¸öÎÊÌ⣬ÎÒÃÇÖ»Òª°ÑSchedulers.io()&AndroidSchedulers.mainThread()Çл»ÎªSchedulers.immediate()¾Í¿ÉÒÔÁË¡£RxJava¿ª·¢ÍŶÓÒѾΪ´ó¼ÒÏëºÃÁË£¬ÌṩÁËRxJavaHooksºÍRxAndroidPluginsÁ½¸öhook²Ù×÷µÄÀà¡£

ÔÚRxPresenterTest.setUp()¼ÓÒ»¾äRxTools.asyncToSync();:

ÔÙÅÜÒ»´ÎtestTestRxJava()£º
×ÜËãÊä³ö"test"£¬¸ÐлÉϵ۰¡!(Ó¦¸Ã´òÉÍϱÊÕß°É^_^)

¶ÁÕßÓÐû·¢ÏÖRxTools.asyncToSync()¶à¼ÓÁËÒ»¾äRxJavaHooks.setOnComputationScheduler(schedulerFunc)£¬Òâ˼½«computationÏß³ÌÇл»ÎªimmediateÏ̡߳£±ÊÕß·¢ÏÖ£¬½ö½öÌí¼ÓRxJavaHooks.setOnIOScheduler(schedulerFunc)£¬¶ÔÓÚÓÐdelayµÄObserable»¹ÊÇδͨ¹ý£¬ÓÚÊÇ˳ÊÖ°ÑcomputationÏß³ÌÒ²Çл»ÁË£¬ÓÚÊǾͿÉÒÔÁË¡£
»¹ÓÐRxJavaHooks.reset()ºÍRxAndroidPlugins.getInstance().reset()£¬±ÊÕß·¢ÏÖ£¬µ±ÔËÐдóÁ¿µ¥Ôª²âÊÔʱ£¬ÓÐЩ»áʧ°Ü£¬µ«µ¥¶ÀÔËÐÐʧ°ÜµÄµ¥Ôª²âÊÔ£¬ÓÖͨ¹ýÁË¡£°Ù˼²»µÃÆä½âºó£¬Ìí¼ÓÁËÄÇÁ½¾ä.....¿ÉÒÔÁË!
(¹ØÓÚRxJavaHooksºÍRxAndroidPluginsµÄʹÓã¬ÔںܾÃǰµÄÎÄÕ ¡¶(MVP+RxJava+Retrofit)½âñî+Mockitoµ¥Ôª²âÊÔ ¾Ñé·ÖÏí¡·ÒѾÌá¼°¹ý)
С½á
±ÊÕߣº¡°Ð¡°×ͬѧ£¬ÏÖÔÚÄã²È¹ýµÄ¿Ó£¬ÌîºÃδ?¡±
С°×£º¡°·½ÕÉ£¬°¡²»£¬´óÉñ£¬ÉÏÃæ¼¸¸öÎÊÌâÊǽâ¾öÁË£¬²»¹ý»¹ÓÐÆäËûÎÊÌâ¡£¡±
±ÊÕߣº¡°²»ÍÚ¿Ó£¬ÔõôÌî¿ÓÄØ?ÒÔºóÔÙ¸øÄã½²½²ÆäËûµ¥Ôª²âÊÔµÄÐþ»ú¡£¡±
С°×£º¡°......¡±
±¾ÎÄÏêÊöÁ˼¸¸öµ¥Ôª²âÊÔÖØÒªÎÊÌâµÄ½â¾ö·½·¨£¬¶ÁÕß²»ÄÑ·¢ÏÖ£¬±ÊÕßһֱǿµ÷ ÒÀÀµ¸ôÀë¡¢ÒÀÀµ¸ôÀë¡¢ÒÀÀµ¸ôÀ룬Õâ¸ö¸ÅÄîÔÚµ¥Ôª²âÊÔÖÐÏàµ±ÖØÒª¡£»¹¸ã²»¶®Õâ¸ö¸ÅÄîµÄͬѧ£¬¿´¶à¼¸´Î¡¶Androidµ¥Ôª²âÊÔ - ÈçºÎ¿ªÊ¼?¡·(ÓÖºñÑÕÎÞ³ÜµØ¹ã¸æ)£¬Í¬Ê±ÔÚʵ¼ùÖв»¶Ï»Ø¹ËÕâ¸öÀíÄî¡£
Ö»Òª½â¾öºÃÕ⼸¸öÎÊÌ⣬Presenterµ¥Ôª²âÊԾͲ»ÄÑÁË¡£»¹Óб¾ÎÄδÌá¼°µÄsqlite¡¢SharedPreferencesµ¥Ôª²âÊÔ¡¢ÔÚºóÃæµÄÎÄÕÂ»á¸ø¶ÁÕß½éÉÜÏ¡£
¸Ðл¶ÁÕß¶Ô±ÊÕßÒ»Ö±ÒÔÀ´µÄÖ§³Ö£¬Âé·³µãÔÞ&ËæÊÖת·¢£¬ºÃÈËÒ»ÊÀƽ°²¡£
|