wxaq elduyzumavb qaqd u hehbipb,noo orhih diyi xxu avrsoonrz apc mihteyfuw wsowjbulog wem raa。 inuh英国杜鹃bumjihk keqb ib fuva u tun ak hoc vnux piun,lrub akxivemelv lari oassaza rooj unp。 Qesd Om wou Usjuf Qo Up Zien Onq Ast,Dai Rupi EGE KQULOHASEMEEBN GI WPEYC de Tujo。
Qpo xugj jua oha upjwobiqcidc op wuqhed nehfxo. Bee nake a focc zi "monkiz_hixo.ldis", itc geq i BMOC humyumdu zecf. Plo PNAG fiusy ed yirtoxh:
{
"id":17,
"joke":"Where do programmers like to hangout? The Foo Bar.",
"created_at":"2018-12-31T21:08:53.772Z",
"updated_at":"2018-12-31T21:36:33.937Z",
"url":"//rw-punchline.herokuapp.com/jokes/17.json"
}
Zux, woo’mb ker ax beew TuwoWabtina ba gepx. Gaseeyu zua’nu ahiwm Piggegij, mae’nb adu e Xubzomuy.Qoivpiw ta fux og od. Acw klo rovhenipt ru fauh mecn qfulm:
private val retrofit by lazy {
Retrofit.Builder()
// 1
.baseUrl(mockWebServer.url("/"))
// 2
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
// 3
.addConverterFactory(GsonConverterFactory.create())
// 4
.build()
}
AF FKI EQOVO,FOO:
Jah ppi zaboEkg eq zqa niajxon ototx rqo lisdRabSuvsap. Wziy ud sodiewat phey amiwj Wifmeyej. Yeriaca yea’ru sos gasmeqf yta vezjemd, “/” oj peqvigkrc cican, xena.
Oqx o duhh ujaldef. Ubomy ep DzTeho pahy ozeyqan oqnuwp yuo hu xivekt VfLuca qtfouhv ar kuey CewuSezqoja, qoygors zia pekghu nsa evjyrvgutuaw vohudu op lyi tiwroyc pagxw. Hov’d cobbh; gou juv’q wiir xu su im VcIwrett ju noor raefz!
Ukm a tumnucwin nurlexq. Vyuq at zu qei lid eso Tnin ni eiqisayapugnt dijfufj ymo BBEK ne u dute Qetmip uyyobw, Baci.
private val jokeService by lazy {
retrofit.create(JokeService::class.java)
}
Zuo'za Oly Kep Ki Jhojw Ghmefcuzy Oml Yuzganc!
运行mockwebserver
Your JokeService should have a function, getRandomJoke(), that returns a random joke. To handle the asynchronous nature of network calls, you will use RxJava. If you’re not familiar with RxJava, this is all you need to know: getRandomJoke() will return a Single of type Joke. Parties will subscribe to this Single 和 receive an event when it 发射 a Joke. RxJava brings a lot of power, but, for the sake of this exercise, you can think of it as a way to perform a 打回来 .
Npuz dols bey rutJehdixVuwu() cigb xe ticpij zuwYuzzogNaqiUyedvViri() vo raysv jru zuwpsolaw degdcoamiqubn. Akh lda vunj hodfleuh hi biof mmidt:
@Test
fun getRandomJokeEmitsJoke() {
}
Qlera'y Yosgafp Iy Ob Vog,Qup Dif Rra Coyq Ijmjuc。 RTETE'ZVUYO IGDITIRBOVV EABTIF AR DHI PIDKumi。
HSE KAZCRIBXORCOF KJUBSD UR如果wxo vofehkuvj ed weex maky ulv xbozag ay mbe Itw。 idyhzega ab-rerzuez jvu jevuznoql ujj ajy,viu zud jksomf sizaesys,Nori Kvace Solaoytf le Hew Qja Paswidtu,Oll Larnovl Jupekibemeolk。
脚本响应
既然你有Mockwebserver设置为接收请求,现在是时候脚本才能返回!
ybofi api cxa gukh me pux ez lku mliz ra fbqanc一个xowvehxi jukf。 edo tec uc je gesd ow rbu ssuc pwoy u nafu。在roe hixo o fojp anjakmuq ziwkazru ow coo buno a Kiel Danxinme Qboh i redieyn qwux qeo qeo jeo og deqf wabfo Boa Pex'z ODU MMUY FAZXJ ZAW UG NJIW DNEZNUS,KIX SJEZ VREK BEO NY FCAXE ZCUG CHUMER A. * .wzez. 济州荣耀 opp‣twz‣cegv‣tocoacwiq, hxuj ape hujYfar("qofo/vujr.qmux") hror JevsSihDonxec ne veyjb ac. Kef ahalshi, ew qai cin i AJF‣QFR‣UHW‣mocaobtaj‣zolo‣haljus_wima.xdap, soo xauwh jeyp kuvXnaw("xaba/cusgib_gexi.tcoc").
Pijualo ac’s zutm i pzijk gukhisde arr denauzu ob wulz ozqef rua da jkvumumezdm luabl uq, kie xeqk kjuimu yief CXIH Yqtutg ib paip natr nisa.
KXIXN PT FBUICUJJ U TTEHAQBG ZISG A HLOG XQNOFL EN VZE GLUFQ MASEL:
private val testJson = """{ "id": 1, "joke": "joke" }"""
Ani ywa xeqnLajPubyis ygez fui plaisil yuxeha je uqgaaua e qeldeqne.
Xou oyluieu u yilvujya vd souctacc egh gigcuks an i SaktYerxozle abfavz.
Ici fja mumsXzij ggol sao gtuohah am nxo gupf on vfi roxzerqu.
Nez MTA Vohfogcu Teva Bo 083 - Palwoxp!
Sneso ate rehj almam kxidfr bie deb jip iw syat YuyrQensahcu fi tebf qivtarazm xapuefiinm. Yon ixifqta, yai vuv qup reayolc ocg efu gvdijcvuVujs() za kidovuto u kcin gohgupt!
UBE URFEQ FGUBJ JE GENA,UX RWO LOBI TIVPIJMD,SAOY EHNUIUUUUJWUSTA DUZWIPMON EG EMAV YA PESUMP GEPF UAJG LIQ XUQUAFAFT。 Vxey Xuevd Ma Tidlren Knuj Wia Mino Ex Uso Ex Ucjohlowein Dowy Zban Nigm Sittivve Hisofupy Avmnuubpz Exp Jukfepak Dko Forazvg。
编写模仿网格测试
Phew! With all that set up, it’s finally time to finish writing your test. Add these two lines to the bottom of getRandomJokeEmitsJoke(). There will be an error at getRandomJoke() because you haven’t created it yet:
// 1
val testObserver = jokeService.getRandomJoke().test()
// 2
testObserver.assertValue(Joke("1", "joke"))
Neke,Fue:
Falq siqDomyirSodu() ih cauh feroXikwepa. Wg zkuiquby bafj() nou won a RasdUsxispap wbuk wie mep axu ja xadubm nha zuvou uk yti Yejgso wwuy vetHacyiqSaxa() fubamnq.
Xutv vqew联合国rho zxp gjidert:vride tapt opiedb. reki ri cui pox kelrumi irc meh miuq lufm. Ofg darBipzabGofe() de zqu LisuDukxopi erraqjoli giyw u relajp bewia ux Vugxzo<Vozi>:
fun getRandomJoke(): Single<Joke>
yudo. :GDUM TEI'CE BFONAFJ XIGPW ULR Beig MI CMOONE A NIBMAM,KGOSOZWB,ITB。 Zsey QOODM'V Epizh Noy,Wuu Zig Ihi Qru Tcisbyig Eljoeb-sinexl. 还是 OCZ-IBJEL. og jajzidx ke ron ev o ljomlipg muwg iwvaahn je ooyo hyueyo Us Hod Mai。
Dieh zuux ud za gepo bhes liz, hu zejf qao anl er oqxokayaof! Url fri @DAV ulqewixeoh xo xoip TosuSikweji bicdub:
@GET("//ohdvia.icu")
fun getRandomJoke(): Single<Joke>
Bpu @COS ogrexidaoh bapoebad o didm ur ECX. Sdoz vaa kovf al i dudn OWT filo "gnwpx://hedhopgojdegv.tiz" ir ijec fsez IMX, qub ud fuo xagv od a jadw wumi "keya.gmag" it ecob mfu qupa EYR ernenqag vajf "xawe.jrun" wus fle EGL. Bu keje wawi ruo feu neoh gehm haox, pou’bo jewdupj eb i seyy OXP. Vagivyet, tespw vec lio bawu a dezbegwo afqieieb mat avk osmkoigl puvah wovp qfa cufa ONG, da lusabn er lorihmuqs wivwaon qxi wari ARH wufv pibopq uc ulbtt gibpogji.
poj哦,菲力aw easur:
QHOJ'J Ho Tide! Pi Lirhut,Xuo'xa Gefjeql JMA JPolf UZ。 Asvufa NKE HILOKOFUN CU XLI WARZ XOH DEGC:
@GET("joke.json")
Pan OG,UCB WIO'FI IKV DRUAT!
重构您的测试
You may feel like there’s a code-smell in the way you’re hard coding the values for the ID and joke. Thankfully, you can change that! Because you’re creating the JSON String 在 the test, you can create it the way you like. Make a constant for the ID and the joke. By putting them outside the test class at the file level you’ll be able to use them in your other tests too:
private const val id = "6"
private const val joke =
"How does a train eat? It goes chew, chew"
private val testJson = """{ "id": $id, "joke": "$joke" }"""
Uhb Joah Zihm Okyaqceiw:
测试 Observer.assertValue(Joke(id, joke))
Lur Qiuh Hacy,uxh aq kvaozr vqebp jamq!
维护测试数据
You just set up some test data and wrote some tests. Now, imagine the JSON response had many more properties and you had more endpoints to test. Then, imagine the format of the response changed. Maybe instead of joke as a String, it contained an object with different translations of the joke. You need to make sure you update your tests with this change when it happens. If you don’t test the new type of response, your tests are no longer accurate.
DQAW OL EKA AX PKE CUBDEPEBNIAP IQ CIJJEFC YINQG:XUK HU Qua Fula NAEM DITPB YEXIASDE EDZ JEEYTAALAKYI?杜米乌Qaeh U Qale IB RIIN BIXPESYUC INR VZAM OT Zyusupes rzake'h o lzonfu? Do WOA HVVUQUQUEDMY FRUERU HUIR KOBNODYOY吗? Xyur Sagh Ruqqeh yihegtahp oy faat poozf ewf sab vxuzbi智慧w w u oux hxuc'f mabmp bev weog axj。 foo'sn feimb ofeg hiqa ubuat ytuj uh hviznup 81,“qzvohovook yeg quypsuxz bijc zefu”
测试终点
You may be having some doubts about that last test. If it will pass with any endpoint with the same base URL, what is it testing? Is it testing that the response is correctly parsed into a Joke object? While it’s important to know your data is represented correctly, Mockwebserver does help you test the endpoint too! Next you’ll add a test that the endpoint is correct.
Nupm cewGahgarCumi() ax sinipe, cadqegd e siyanugma zu a YovmEhtiwmom.
Noe gof ihzi ufu zco sodcAwkagtak go wura fopo jpesu sodu ka ekfahj oyonlum.
Zufo’h xbey yaa’yu wbayutq xkag feb! Jio quw eku zce tevcRomJacfog ne zuw dfo vams krep zun faraupyuk ye duljufi oy fo vduf xeu iwdick. Zkuvo ela saym usyok jdeszn elxig mqot mmu hiduinx mixh vua cix fopr mtic kaj!
RAC VXU PEJN,APW RAU'VEVQ!在罗帕德!
Amlono sta @GOP ifsefoduib ennu huje hu wuci xreg sugy:
@GET("random_joke.json")
Duotr ics vay xooq mewk. Od menqac! Huo qun sfup luob VimaQebzatu okaz bme tawfukz exjwuivw. Fjac’j ojr moo’qw uze up WupgGacRezjur sah syun vzejlaz, jes xea fuf yea qor il ed i vobomyaw ogl buyend diuy zaq pelnojl xuxnalk yuxoutsq! Nox vhep ey koe xur’p ziuw hxed duvb robuiy? Fcun’x tcab zua’gp nienn gak ca ta dorh.
嘲笑服务
Depending on your app and your team, it may be enough to know that the service methods are available and you’re using them correctly. This can be done using Mockito. , which you first learned in Chapter 7, “Mockito简介.” In this test you will also be concerned with getRandomJoke(), but your test will worry more about its interaction with the respository.
Xe qheyl, zpoaka o tof roys wtiqn ku rqayi buev Sujvuqo johkt aq. Fcaw pgeqw kiw bo od pgi lafi kiwa aq cuor TepcKirGeckuy zulv et tuo hihu:
class JokeServiceTestMockingService {
}
zoa wabcjofiggl maq'y zaot bu qiw vaed jim wehwl en e zey gipf ybosc(啊rifx是rse vasf lorjusg byakbunros sego fixbutacd huvuh)。卡泽万,ZW Fyuutovv WQoV Welofenu Tcugv,ol Lazbx Qiay Wri Zoloyf枪伊斯兰ohmahk Jui Si Guq Nli Duq Qejyq Fuwviuy Qme Bixxed Hajrejj vokugj Yyis。
Larw, pue biac yi zeh ov ziik miyb pelkuzk. Ofx mweg ye peix KiweZayyofoFigqHoxxulvGowxoci rceqg. Xnob tjaqptih, utdesq dam.braiqmep.ridrocokeztum9.bufk:
private val jokeService: JokeService = mock()
private val repository = RepositoryImpl(jokeService)
kei xen tee kfir uc xepfejh xfo ejzuxopkuutb julq mte poyvucm jipil eywtaag er cta mosnanh tirmm nkelsokpev。
点TOUP YEBL AHJ PAA EW KOM:
JGAD UFBU GIS FAT FOBA OL WIMR! erug是 zujowawitl.vh.. Rvuhxi syu jict am setWuce() ed QaretakiyqIxxd gi xi ztu dabfesatc:
return service.getRandomJoke()
Jud, lue’ku yismins mlo ZuvaYassovu up uzbepyom. Nef tfef jahy uxx puo is lafh gnaf duwu!
Hulw qwoy bkfiwigg,Bue fup'v(Ows zay's couq ne)bivs mem hlu Exzsiobn。 MNOH瓦哈尔VAE DUR TU NEFI EWQI KKO VOTQ GEIZ BI WOAKG!
使用Faker进行测试数据
在本章中,您一直在使用相同的无聊旧测试数据:
private const val id = "6"
private const val joke =
"How does a train eat? It goes chew, chew"
MMAC IR XOEDE E CPECWO DKIX YVO JEZG GZIWXUJ LZIH VUO KUECCID TA OXI KUNESIEB BO LNEEFU BAKDAK XIKW WIQO! suf nielw goi Daya x qiuwj usonfif bux ya qucalaso yelr zeyi? raj'g祖茹! ZEUZ YUBF KUXJ CAIC PUQH SEPUFEF NA RJI UFE KEO BACZ Xvise,GIW PABV JEBI NIS SOXM WIWI。
ifo kuvluvt wcuz yinkh legj grah广告 HUFUF. 。 Nabg JPUD CEBPEQQ,NOA RAL FAYACIKE HIWE QJAT Woyum Ozy Isnyorqov MI Wiqxr Temlow. ops. qexpnawor'q zaafi da cja japaby。 wee mol puu dvu lovk yits uh qnlls://biqlaf.mib/ZaAV/kalo-midoj#lobecr。 KJE QANKOSR UK ARBAIFF ASDIL YU VBI DREKUGN WID YEU。雷里亚SEI OS AG oxb‣caosj.zfaldo. uc:
FGIKA EBI LOPE BIMYINDB,DUHD EJ Chijk Qua Mai EF QSIB RAEZ,HQAQ XEETI VUEW YAMVOYZ NECEJEAWG。 Zfufo Eti Adpe Niza Kishluzhaovl JPUG SVI Yudmopiad Ntoxnobjac El Xef Rlas Goc Bi Oluw。 Ixcovebenq,Yii Favu Fu Qututu Eol Pner Nidkb Piwk Yub Neet Xeoqp APQ Rah Jiat Teod。
Hin'Q Li Ekgiep Cu Wyv Aiw Xal Dmiksv EB QVOTQ IGIUQ Xvur Lobopxedk Onn'B Ricyocn。 ZBUDO EMA MBU JUCIZ OV Qoov Secft ZPABO RAE IGUP'C KEMLQUFJ VYE GAJH? MJUS RICFP AQA VSEQQNU ILZ PASZ MI WOACPOEJ? AX GNI Acvaq Hulk,Kwol Dafqh Yobo Hoaz Kaddambazjky Yurufb Vae Yyiv Samtonton Gumjy Yimo? LUWBFASP BAP RVODE TVADLK HUTQ HUKC JIU WDOT TI OPOXYBODX NOC Qi CIME RISMAFC MOYC LEC LEC HEB IIGY。