Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
Androidµ¥Ôª²âÊÔ - ¼¸¸öÖØÒªÎÊÌâ
 
×÷Õߣº¼üÅÌÄÐ À´Ô´£º51cto ·¢²¼ÓÚ;2016-11-8
  5177  次浏览      27
 

ǰÑÔ

ÒѾ­Ò»¸öÔÂûдÎÄÕÂÁË£¬ÓÉÓÚ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µ¥Ôª²âÊÔ¡¢ÔÚºóÃæµÄÎÄÕÂ»á¸ø¶ÁÕß½éÉÜÏ¡£

¸Ðл¶ÁÕß¶Ô±ÊÕßÒ»Ö±ÒÔÀ´µÄÖ§³Ö£¬Âé·³µãÔÞ&ËæÊÖת·¢£¬ºÃÈËÒ»ÊÀƽ°²¡£

   
5177 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

΢·þÎñ²âÊÔÖ®µ¥Ôª²âÊÔ
һƪͼÎÄ´øÄãÁ˽â°×ºÐ²âÊÔÓÃÀýÉè¼Æ·½·¨
È«ÃæµÄÖÊÁ¿±£ÕÏÌåϵ֮»Ø¹é²âÊÔ²ßÂÔ
È˹¤ÖÇÄÜ×Ô¶¯»¯²âÊÔ̽Ë÷
Ïà¹ØÎĵµ

×Ô¶¯»¯½Ó¿Ú²âÊÔʵ¼ù֮·
jenkins³ÖÐø¼¯³É²âÊÔ
ÐÔÄܲâÊÔÕï¶Ï·ÖÎöÓëÓÅ»¯
ÐÔÄܲâÊÔʵÀý
Ïà¹Ø¿Î³Ì

³ÖÐø¼¯³É²âÊÔ×î¼Ñʵ¼ù
×Ô¶¯»¯²âÊÔÌåϵ½¨ÉèÓë×î¼Ñʵ¼ù
²âÊԼܹ¹µÄ¹¹½¨ÓëÓ¦ÓÃʵ¼ù
DevOpsʱ´úµÄ²âÊÔ¼¼ÊõÓë×î¼Ñʵ¼ù
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

LoadRunnerÐÔÄܲâÊÔ»ù´¡
Èí¼þ²âÊÔ½á¹û·ÖÎöºÍÖÊÁ¿±¨¸æ
ÃæÏò¶ÔÏóÈí¼þ²âÊÔ¼¼ÊõÑо¿
Éè¼Æ²âÊÔÓÃÀýµÄËÄÌõÔ­Ôò
¹¦ÄܲâÊÔÖйÊÕÏÄ£Ð͵Ľ¨Á¢
ÐÔÄܲâÊÔ×ÛÊö

ÐÔÄܲâÊÔ·½·¨Óë¼¼Êõ
²âÊÔ¹ý³ÌÓëÍŶӹÜÀí
LoadRunner½øÐÐÐÔÄܲâÊÔ
WEBÓ¦ÓõÄÈí¼þ²âÊÔ
ÊÖ»úÈí¼þ²âÊÔ
°×ºÐ²âÊÔ·½·¨Óë¼¼Êõ

ij²©²ÊÐÐÒµ Êý¾Ý¿â×Ô¶¯»¯²âÊÔ
IT·þÎñÉÌ Web°²È«²âÊÔ
IT·þÎñÉÌ ×Ô¶¯»¯²âÊÔ¿ò¼Ü
º£º½¹É·Ý µ¥Ôª²âÊÔ¡¢Öع¹
²âÊÔÐèÇó·ÖÎöÓë²âÊÔÓÃÀý·ÖÎö
»¥ÁªÍøweb²âÊÔ·½·¨Óëʵ¼ù
»ùÓÚSeleniumµÄWeb×Ô¶¯»¯²âÊÔ