快速导航×

Java单元测试技巧之PowerMock-软件资讯-KOK官网

发表于: 2021-07-31 01:25
本文摘要:简介:高调的技术正在与老师谈谈方法论:“复杂的问题是简单的,简单的问题应该不明智。“这句话让我感觉很深,这不是写代码 - 将复杂逻辑分成许多简单逻辑的方法,然后在深度上执行每个简单的逻辑,最后将这些简单的逻辑集成到复杂的逻辑中,总结为八个字符,总结为八个字符, “简化,很简单。” 前言高德科技正在与教师谈论方法论:“复杂的问题被简化,简单的问题应该不明智。

KOK官网

简介:高调的技术正在与老师谈谈方法论:“复杂的问题是简单的,简单的问题应该不明智。“这句话让我感觉很深,这不是写代码 - 将复杂逻辑分成许多简单逻辑的方法,然后在深度上执行每个简单的逻辑,最后将这些简单的逻辑集成到复杂的逻辑中,总结为八个字符,总结为八个字符, “简化,很简单。” 前言高德科技正在与教师谈论方法论:“复杂的问题被简化,简单的问题应该不明智。

“这句话让我感觉很深,这不是写代码 - 将复杂逻辑分成许多简单逻辑的方法,然后在深度上执行每个简单的逻辑,最后将这些简单的逻辑集成到复杂的逻辑中,总结为八个字符,总结为八个字符, “简化,很简单。” 写下Java单元测试用例,实际上,“复杂的问题被简化” - 即拆除复杂的代码为一系列简单的单元测试用例; 编写Java单元测试用例,实际上放置了“简单问题介绍” - 即学习一组方法,总结一组模式并应用于练习。在这里,根据日常工作经验,提交人总结了一些Java单元测试技术,为每个人进行沟通和学习。

1.准备PowerMock是其他模拟框架的扩展,例如EasyMock,更强大的框架。PowerMock使用自定义类加载器和字节码操作来模拟静态方法,构造函数,最终类和私有方法,删除静态初始化程序等。1.1。

介绍PowerMock包以介绍PowerMock包,您需要在Pom.xml文件中添加以下Maven依赖项:1.2。SpringMVC项目中的集成Springmvc项目,您需要在Pom.xml文件上添加JUnit:1.3。

将SpringBoot项目集成在SpringBoot项目中,您需要在Pom.xml文件上添加JUnit:1.4。一个简单的测试用例,使用该列表,模拟不存在列表的列表,但返回列表是100。

公共类ListTest {@Test public void testsize(){整数预期= 100; 列表列表= powermockito.mock(list.class); powermockito.when(list.size())然后return(预期); Integer实际=列表。尺寸 (); assert.asstequals(“返回值不等于”,预期,实际);}} 2.模拟声明2.1。

模拟方法声明:t powermockito.mock(class clazz); 使用:可用于模拟指定类对象实例。在模拟最终类(接口,普通类,虚拟基础)的非最终方法时,不必使用@runwith和@preparefort注释。在模拟最终类或最终方法时,必须使用@Runwith和@preparefort最讨论。

注解形注解形:@runwith(powermockrunner.class)@preparefortest({targetclass.class})2.1.1。模拟非最终类普通方法@ getter @ setter @ tostringpublic类矩形实现夏普{私有双宽;私人双高; @override public double getarea(){返回宽度*高;公共类Rectanglet最终{@test public void testgetarea(){double deperparea = 100.0d;矩形矩形= powermockito.mock(rectangle.class); powermockito.when(rectangle.getarea())。然后(edemparea); Double ActualArea = Rectangle.getarea(); assert.assertequals(“返回值不成等”,emperalarea,Istancearea,1E-6D); 2.1.2。

模拟最终类或最终方法@ getter @ setter @ toString公共最终类圈{私有双半径; public double getarea(){return math.pi * math.pow(Radius,2); }} @ runwith(powermockrunner.class)@preparefortest({circle.class})公共类circletest {@test public void testgetarea(){double deperparea = 3.14d;圈圈= powermockito.mock(circle.class); powermockito.when(circle.getaraea())。然后return(edemparea); Double ActualArea = Circle.getarea(); assert.assertequals(“返回值不成等”,emperalarea,Istancearea,1E-6D); 2.2。模仿方法说明:powermockito.mockstatic(类Clazz);用途:可以使用“@runwith”和“@preparefortest”注解。

@runwith(powermockrunner.class)@preparefortest({stryutils.class})公共类stringutilstest {@test public void testisempty(){string string = “abc ”; 布尔值预期=真实; powermockito.mockstatic(Stringutils.class); powermockito.when(strictutils.isusempty(string))然后return(预期); 布尔实际= Stringutils.isusempty(String); assert.astequals(“返回值不等于”,预期,实际);}} 3.间谍语句如果一个对象,我们只想模拟其一些方法,并希望其他方法可以使用powermockito。替换powermockito.mock方法的间谍方法。因此,由语句设置的方法是仿真方法; 当语句时无法设置,并调用原始方法。

3.1。Spy类声明:Powermockito.spy(类Clazz); 用途:用于仿真类的部分方法。

案例:公共类Stringutils {公共静态布尔Isnotempty(最终CharSequence CS){Return Isempty(CS);}公共静态布尔缺乏(最终CharSequence CS){return cs == null || cs.length()== 0 ;! }} @ runwith(powermockrunner.class)@preparefortest({stryutils.class})公共类stringutilstest {@test public void testisnotempty(){string string = null; 布尔值预期=真实; powermockito.spy(Stringutils.class); Powermockito。当(strictutils.isusempty(String)).henreturn(!“(!”); assert.assertequals; assert.asterequals(“返回值不等于”,预期,实际); 3.2。间谍对象 声明:t powermockito.spy(t对象); utue:模拟对象的一些方法。案例:公共类用户服务{私人长超级用户; public boolean iSnotsuperuser(long userid){return!issuperuser(userid); }公共布尔开签发者(long userid){return object.equals(userid,superuserid); @ runwith(powermockrunner.class)public classerviceTestest {@test public void testisnotsuperuser(){long userid = 1l;布尔预期=假;用户服务userservice = powermockito.spy(新用户服务()); powermockito.when(userservice.issuperuser(userid))。

然后return(!预期); Boolean Attual = Userservice.IsnotsUperUser(UserID); assert.assertequals(“返回值不合等”,预期,实际); }} 4.当¼4.1时。当()。然后return()模式模式明:powermockito.when(mockobject.somemethod(someargs))。然后return(预示值); powermockito.hy(mockobject.somemethod(someargs))。

thenthrow(ithravable); powermockito.hy(mockobject。Somemethod(Someargs))。然后或或调调。4.1.1。

返回期刊公共类ListTest {@Test公共void testget(){int index = 0;整数预期= 100; listintegermocklist = powermockito.mock(list.class); powermockito.when(mocklist.get(索引))。然后return(预期); Integer实际= mocklist.get(索引); assert.assertequals(“返回值不合等”,预期,实际); }} 4.1.2。返回期刊异常公共类列表{@test(预期= indexoutofboundsexception.class)public void testget(){int index = -1;整数预期= 100; listintegermocklist = powermockito.mock(list.class); powermockito.when(mocklist.get(索引))。

thenthrow(new indexoutofboundsexception()); Integer实际= mocklist.get(索引); assert.assertequals(“返回值不合等”,预期,实际); 4.1.3。返回期刊公共类ListTest {@Test公共void testget(){int index = 1;整数预期= 100; listintegermocklist = powermockito.mock(list.class); powermockito.when(mocklist.get(index))。ansanwer(调用 - {整数值=调用.getargument(0);返回值* 100;}); Integer实际= mocklist.get(索引); assert.assertequals(“返回值不合等”,预期,实际); 4.1.4。

公共类ListTest {@Test public void testget(){int index = 0;整数预期= 100; listintegeroldlist = new arraylist(); oldlist.add(预期); listintegerspylist = powermockito.spy(olllist); powermockito.when(spylist.get(索引))。thencallrealmethod(); Integer实际= Spylist.get(索引); assert.assertequals(“返回值不合等”,预期,实际); }} 4.2。doreturn()。当()模式声明:powermockito.doreturn(预示值)。

当(mockobject).somemethod(someargs); powermockito.dothrow(ithravable)。当(mockobject).somemethod(someargs); powermockito.doanswer(预计)当(Mockobject)时.somemethod(someargs); powermockito.donothing()。当(mockobject).somemethod(someargs); powermockito.docallrealmethod()。

当(mockobject).somemethod(someargs);用语,Ⅳ,Ⅳ,或,或调真实的方法,无需无需行原始方法 注意:请勿使用以下语法:powermockito.doreturn(预示值)。当(mockobject.somemethod(someargs))时; Powermockito.dothrow(ithravable)。当(mockobject.somemethod(someargs))时; powermockito.doanswer(预期的人)。(mockobject.somemethod(someargs)); powermockito.donothing()何时(mockobject.somemethod(someargs)); powermockito.docallrealmethod()何时(mockobject.somemethod(someargs)); 虽然不会发生编译错误,但在执行期间抛出未完成的istubbingException。

4.2.1。返回期刊公共类ListTest {@Test公共void testget(){int index = 0;整数预期= 100; listintegermocklist = powermockito.mock(list.class); powermockito.doreturn(预期)。当(模拟).get(索引); Integer实际= mocklist.get(索引); assert.assertequals(“返回值不合等”,预期,实际); 4.2.2。返回期刊异常公共类列表{@test(预期= indexoutofboundsexception.class)public void testget(){int index = -1;整数预期= 100; listintegermocklist = powermockito.mock(list.class); powermockito.dothrow(new indexoutofboundsexception())。

什么时候(模拟).get(索引); Integer实际= mocklist.get(索引); assert.assertequals(“返回值不合等”,预期,实际); 4.2.3。返回期刊公共类ListTest {@Test公共void testget(){int index = 1;整数预期= 100; listintegermocklist = powermockito.mock(list.class); powermockito.doanswer(调用 - {整数值=调用.getargument(0);返回值* 100;})。什么时候(模拟).get(索引); Integer实际= mocklist.get(索引); assert.assertequals(“返回值不合等”,预期,实际); }} 4.2.4。模拟无返回值公共类listtest {@test public void testclear(){listintegermocklist = powermockito.mock(list.class); powermockito.donothing()。

当(模仿).clear(); Mocklist.clear(); mockito.verify(模拟).clear(); }} 4.2.5。公共类ListTest {@Test public void testget(){int index = 0;整数预期= 100; listintegeroldlist = new arraylist(); oldlist.add(预期); listintegerspylist = powermockito.spy(olllist); docallrealmethod()。什么时候(Spylist).get(索引); Integer实际= Spylist.get(索引); assert.assertequals(“返回值不合等”,预期,实际); }} 4.3。

两种模式的主要主要区别种模式都都都都都用法,在嘲笑实例下使用时,基本的是没有。但是,在SPY实例中使用时,何时()。thereturn()模式将执行原始方法和doreturn()。当()模式不执行原始方法时。

测试服务类:@ serv4j @ servicepublic class uservice {public long getusercount(){log.info(“呼叫获取用户编号方法”); 返回0L;}}何时()。thentrenturn()模式:@runwith(powermockrunner.class)公共类用户服务器{@test public void testgetuserCount(){long期望= 1000l; 用户服务userservice = powermockito.spy(新用户服务()); powermockito.when(userservice.getusercount())然后(预期); long peranical = userservice.getusercount(); assert.assertequals(“返回值不等于”,预期,实际);}在测试过程中,打印“呼叫获取用户编号方法”日志。

使用doreturn()何时()模式:@runwith(powermockrunner.class)public clserseviceTest {@test public void testgetusercount(){long期望= 1000l; 用户服务userservice = powermockito.spy(新用户服务()); powermockito.doreturn。(预期)。

(用户服务).getusercount(); long peranical = userservice.getusercount(); assert.asstequals(“返回值不等于”,预期,实际);}}在测试期间不会打印在测试“呼叫采集用户定量方法”日志中。4.4当新的建模方法声明时:PowerMockito.Whenew(MockClass.Class).withnoarguments()thenreturn(prequestialObject); powermockito.whennew(mockclass.class).witharguments(someargs).thenreturn(预期的object); 用途:用于模拟施工方法。案例:公共最终类文件{public static boolean iSfile(String filename){return new file(filename).isfile(); }} @ runwith(powermockrunner.class)@preparefortest({fileutils.class})公共类文件{@test public void testisfile()抛出异常{string filename = “test.txt ”; 文件文件= powermockito.mock(file.class); powermockito.whennew(file.class).witharguments(filename).thenreturn(文件); powermockito.when(file.isfile())。

然后return(true); Assert.Astrtrue(“返回值为假”,fileutils.isfile(filename)); }}}注意:需要加上注解@preparefortest({fileutils.class}),否则否则方法不生产。5.执行参数匹配时,有时不关心传入参数的值,并且可以使用参数匹配。

5.1。参数匹配器(任何)Mockito提供Mockito.nyint(),mockito.anystring,mockito.ny(类Clazz)等,正在等待任何价值。公共类ListTest {@Test public void testget(){int index = 1; 整数预期= 100; listintegermocklist = powermockito.mock(list.class); powermockito.when(mocklist.get(mockito.anyint())然后return(intelec); Integer实际= mocklist.get(索引); Assert.Astequals(“返回值不等于”,预期,实际);}} 5.2。

参数匹配器(EQ)在使用参数匹配时,所有参数都应使用匹配。如果要为某个参数指定特定值,则需要使用mockito.eq()方法。@runwith(powermockrunner.class)@preparefortest({stryutils.class})公共类stringutilstest {@test public void teststartwith(){string string = “abc ”; 字符串前缀= “b ”; 布尔值预期=真实; powermockito.spy(Stringutils.class); powermockito.when(stringutils.startswith(mockito.anystring(),mockito.eq(prefix)))然后return(预期); boolean实际= stringutils.startswith(字符串,前缀); assert.assertequals(“返回值不等于”,预期,实际);}} 5.3。

额外的匹配Mockito的附加器类提供了一些参数匹配,我们可以执行大于(gt)的参数,小于(LT),大于或等于(GEQ),小于或等于(LEQ)等),参数和( 和),或(或)可以执行非(或)等。公共类ListTest {@Test public void testget(){int index = 1; 整数预期= 100; listintegermocklist = powermockito.mock(list.class); powermockito.when(mocklist.get(addurematchers.geq(0))))。Thenreturn(预期); powermockito.when(mocklist.get(abouthtmatchers.lt(0)))thenthrow(new indexoutofboundsexception()); Integer实际= mocklist.get(索引); Assert.Astequals(“返回值不等于”,已被调整,实际;}} 6.验证语句验证是否确认,在仿真过程中,测试方法是否已按预期与其依赖方法进行交互。

格式:mockito.verify(int)])。SomeMethod(Somgargs); 使用:用于模拟对象方法,直接返回所需的值,异常,响应或呼叫实际方式,无需原始方法。案例:6.1。

验证呼叫方法公共类listtest {@test public void testget(){listintegermocklist = powermockito.mock(list.class); powermockito.donothing(); 模拟列表).clear(); Mocklist.clear(); mockito.verify(模拟).clear();}}} 6.2验证呼叫公共类ListTest {@test public void testget(){listintegermocklist = powermockito.mock(list.class); powermockito.donothing()当(模拟).clear(); Mocklist.clear(); mockito.verify(模拟列表,mockito.times)。清除();}}除了时代,Mockito还支持Atleastonce,至少,只有,最大的,最大的等等。

一些验证者。6.3。公共类ListTest {@Test public void testadd(){listintegermockedlist = powermockito.mock(list.class); powermockito.doreturn(true)。

当(模仿列表).add(mockito.anyint());嘲笑列表.DD(1);嘲笑列表.DD(2);嘲笑列表.DD(3); InOrder InOrder = Mockito.inorder(模型列表); Inorder.verify(模型列表).add(1); Inorder.verify(模型列表).add(2); Inorder.verify(模型列表).add(3); 6.4。验证验证用品公共类ListTest {@Test public void testargumentCaptor(){整数[]期望=新整数[] {1,2,3}; listintegermockedlist = powermockito.mock(list.class); powermockito.doreturn(true)。当(模仿列表).add(mockito.anyint()); for(Integer期望:预期){mockedlist.add(预期); } AgjectionCapTorInteGerargumentCaptor = ArgumentCaptor.ForClass(Integer.class); mockito.verify(模型列表,mockito.times(3))。

添加(ArgumentCaptor.Capture()); Integer []实际= ArgumentCapTor.getAllValues()。ToArray(新整数[0]); assert.assertarrayequals(“返回值不成等”,预期,实际); 6.5。〖mockito〗mockito.verifynomore遍及方法,在没有验证方法之外可以使用此方法,以确保所调验证验证。

如果在模拟对象上存在任何前所未有的呼叫,则将抛出NOInteriaStedWanted异常。公共类listtest {@test public void testverifynomoreinteractions(){listintegermockedlist = powermockito.mock(list.class); mockito.verifynomore interactions(模型列表); //执行正常的模型列表。mockito.verifynomore interactions(模型列表); //抛出Outlook}}}注意:Mockito.VerifyzereDeactions方法与Mockito.verifyNomOreInterActions方法相同,但它已被丢弃。

6.6。验证静态方法Mockito没有静态验证方法的方法,但PowerMock提供了此支持。

@runwith(powermockrunner.class)@preparefortest({stryutils.class})公共类stringutilstest {@test public void testverifystatic(){powermockito.mockstatic(stryutils.class); 字符串预期=“abc ”; Stringutils.isusempty(预期); powermockito.verifystatic(Stringutils.class); ArgumentCaptorStringArgumentCaptor = ArgumentCapTor.ForClass(String.Class); stringutils.isusempty(ArgumentCaptor.Capture()); Assert.Astrequals(“参数不等于”,ArgumentCaptor.getValue(),已被指定;}} 7.私有财产7.1。ReflectionTestutils.setField方法使用本机JUnit时,我们通常使用reflectionTestutils.setfield方法来设置私人方法 属性值。@servicepublic类uservice {@value(“$ {system.userlimit} ”)私人长期userlimit; public long getUserLimit(){return userlimit;}}公共类用户服务{@autowired private用户服务器用户服务; @test public void testgetUserLimit(){long期望= 1000L; ReflectionTestutils.setfield(用户服务,“UserLimit ”,预期); long alatual = userservice.getUserLimit(); Assert.Astequals(“返回值不等于”,预期,实际);}}注意:如果实例是动态代理,则反映Testutils.setfield,则由@autowired加载UserAvice实例。方法设置为代理实例,从而导致无效。

7.2。Whitebox.seternalstate方法现在使用powermock制作单元格测试,可以使用withbox.setinternalstate方法来设置私有属性值。

@servicepublic类uservice {@value(“$ {system.userlimit} ”)私人长期userlimit; 公共Long GetUserLimit(){return userlimit; @ runwith(powermockrunner.class)public clserseviceTestest {@injectmocks私有用户服务用户服务; @test public void testgetUserLimit(){long期望= 1000L; Whitebox.seternalstate(用户服务,“UserLimit ”,预期); long alatual = userservice.getUserLimit(); assert.assertequals(“返回值不合等”,预期,实际); }}}注意:需要加上注解@runwith(powermockrunner.class)。8. 8.1模拟私有方法由私有方法实现8.1.1公共类用户服务{私有Long SuperUserID; ..公共布尔IsnotsuperUser(Long UserID){return issuperuser(userid);!}私有布尔开签证(long userid){return对象 .equals(userid,superuserid);}}} @ runwith(powermockrunner.class)@preparefortest({userservice.class})公共类useyervicetest {@test public void testisnotsuperuser(返回异常{long userid = 1l); 布尔预期=假; 用户服务userservice = powermockito.spy(新用户服务()); powermockito.when(用户服务,“issuperuser ”,userid).thenreturn(预期!); Boolean Attual = Userservice.IsnotsUperUser(UserID); assert.asterquals(“返回值不等于”,预期,实际);}} 8.1.2。仿真方法的实现还可以通过仿真方法存根(短截线)通过存根来实现。

但是,只能模拟整个方法的返回值,无法模拟指定参数的返回值。@runwith(powermockrunner.class)@preparefortest({userservice.class})公共类veryerviceTest {@test public void testisnotsuperuser()抛出异常{long userid = 1l;布尔预期=假;用户服务userservice = powermockito.spy(新用户服务()); powermockito.stub(powermockito.method(userservice.class,“issuperuser ”,long.class))。Toreturn(!预期); Boolean Attual = Userservice.IsnotsUperUser(UserID); Assert.Astequals(“返回值不足等”,预期,实际;}} 8.3。测试别无方法@runwith(powermockrunner.class)public clserserviceTest9 {@test public void testssuperuser()抛出异常{long userid = 1l; Boolean预期= false; userservice userservice = new userservice();方法方法= powermockito.method(userservice.class,“issuperuser ”,long.class);对象实际=方法.Invoke(用户服务器,userid); assert.assertequals (“返回值不成等”,预期,实际);}} 8.4。

验证私有条法@runwith(powermockrunner.class)@preparefortest({userservice.class})公共类useurevicetest10 {@test public void testisnotsuperuser()抛出例外{long userid = 1l;布尔值预期= false; userservice userservice = powermockito.spy(new userservice()); powermockito.when(用户服务,“issuperuser ”,userid).thenreturn(!预期); boolean实际=用户服务.isnotsuperuser(userid); powermockito.verifyprivate(UserService).invoke(“isuperuser ”,userid); assert.assertequals(“返回值不合等”,预期,实际);}}}中华宝 9.主要是Note PowerMock提供了一系列注释,以更好地支持SpringMVC / SpringBoot项目,这大大简化了测试代码。9.1。@runwith note @runwith(powermockrunner.class)指定使用PowerMock框架中的单位测试Runner的JUnit。

9.2。@preparefort最新注释@preparefort({targetclass.class})当您需要模拟最终类别,最终方法或静态方法时,您需要添加@preparefort最新的注释并指定该方法所在的类。如果您需要指定多个类,请在{}中添加多个类并用逗号单独间隔。

9.3。@Mock注意@Mock注意创建一个完整的模拟实例,所有属性和方法都是空白(0或null)。9.4。@spy note @spy note创建一个没有模型的实例,所有成员方法都按照原始方法的逻辑执行,直到模拟返回特定值。

KOK官网

注意:需要初始化@SPY注释的变量,否则会抛出异常。9.5。@inectMocks注释@inectMocks注释创建一个实例,这个实例可以调用真正的代码方法,其余的@Mock或@spy注释将注入此实例。

@servicepublic类用户服务{@autowired private userdao userdao;公共void modifyuser(uservo uservo){userdo userdo = new userdo(); beanutils.copyproperties(Uservo,Userdo); userdao.modify(Userdo); @ runwith(powermockrunner.class)public clserseviceTestest {@mock private userdao userdao; @injectmocks私人用户服务用户服务; @test public void testcreateuser(){uservo uservo = new uservo(); uservo.setId(1L); uservo.setname(“changyi ”); uservo.setdesc(“测试用户”); userservice.modifyuser(uservo); ArgumentCapTorUserDoargumentCaptor = ArgumentCaptor.ForClass(Userdo.class); mockito.verify(userdao).modify(ArgumentCaptor.Capture()); userdo userdo = AgjectionCaptor.getValue(); assert.assertnotnull(“用词实例为”“,Userdo); assert.assertequals(“用来标识不再等”,uservo.getid(),userdo.getId()); assert.assertequals(“用来名称不合形等”,uservo.getname(),userdo.getname()); assert.assertequals(“用途描述不再等”,uservo.getdesc(),userdo.getdesc()); 9.6。@captor注解@captor注解在字段字段创建分数仪器。

但是,您必须在启动测试方法之前调用MockitoAnnotations.openMocks(此)进行初始化。@servicepublic类用户服务{@autowired private userdao userdao;公共void modifyuser(uservo uservo){userdo userdo = new userdo(); beanutils.copyproperties(Uservo,Userdo); userdao.modify(Userdo); @ runwith(powermockrunner.class)public clserseviceTestest {@mock private userdao userdao; @injectmocks私人用户服务用户服务; @Captor私人ArgumentCaptorUserdoargumentCaptor; @Before public void beforeStest(){mockitoannotations.openmocks(此); @test public void testcreateuser(){uservo uservo = new uservo(); uservo.setId(1L); uservo.setname(“changyi ”); uservo.setdesc(“测试用户”); userservice.modifyuser(uservo); mockito.verify(userdao).modify(ArgumentCaptor.Capture()); userdo userdo = AgjectionCaptor.getValue(); assert.assertnotnull(“用词实例为”“,Userdo); assert.assertequals(“用来标识不再等”,uservo.getid(),userdo.getId()); assert.assertequals(“用来名称不合形等”,uservo.getname(),userdo.getname()); assert.assertequals(“用途描述不再等”,uservo.getdesc(),userdo.getdesc()); 9.7。@powermockignore注解为了解决使用Powermock后,提示类加载器错误。

10.相关意见10.1。“Java开发手册”规范[强制性]好单元测试必须符合空气原则。说明:当线测试在线运行时,它感觉像空气(空气),但对测试质量的质量非常重要。

良好的单位测试宏,自动化,独立和可重复的功能。答:自动I:独立R:可重复的[强制性]单元测试应完全执行,而非交互式。测试用例通常定期执行,并且执行过程必须完全自动化。

输出不是测试的好单元测试。单元测试不允许使用System.out进行人类肉类验证,必须使用断言验证。

[强制性]可以重复单元测试,并且不能受外部环境的影响。注意:单元测试通常放置在连续集成中,每次有代码检查时都执行单元测试。如果外部环境(网络,服务,中间件等)取决于外部环境(网络,服务,中间件等)易于导致连续的集成机制不可用。

journal:为了不受外部环境的影响,需要在需要设计代码时注入SUT的依赖性,并且将本地(存储器)实现或模拟实现注入诸如SPRIP的DI帧。[推荐]写入单元测试代码符合BCDE原则,以确保测试模块的交付质量。B:边界,边界值测试,包括循环边界,特殊值,特殊时间点,数据顺序等。

C:正确,正确的输入,预计。D:设计,结合设计文档来写入单元测试。

E:错误,强制性错误消息输入(例如非法数据,异常流,业务允许外部等),并获得预期的结果。10.2。

为什么要使用模拟? 根据网络相关材料,摘要视图如下:模拟可用于缓解外部服务依赖性,从而确保测试用例的独立性。目前的互联网软件系统通常使用分布式微型服务。

该装置对某些其他服务进行了高度抗性和不起眼,以便测试服务。模拟可以减少完整的链路测试数据准备,从而提高书写测试用例的速度。传统的集成测试需要准备完整的链接测试数据,并且某些链接不是您熟悉的。

最后,很多时间和经验都没有得到你想要的结果。仅需要模拟上游输入数据所需的本机测试,并验证下游输出数据,写入测试情况和测试速度。模拟可以模拟一些异常过程,以确保测试用例的代码覆盖范围。

根据单元测试的BCDE原理需要边值测试(错误),这有助于覆盖整个代码逻辑。在实际系统中,很难构造这些边界值,也很难触发这些错误消息。模仿的根本解决了这个问题:什么样的边界价值想要,只需要模拟; 需要什么样的错误消息,只需要模拟。

Mock无法加载项目环境配置以确保测试用例的速度。当集成测试时,我们需要加载项目的所有环境配置,启动依赖于项目的所有服务接口。测试用例通常需要几分钟或更少的分钟。通过模拟实现的测试用例,请勿加载项目环境配置,或依赖于其他服务接口,执行速度通常在几秒钟内,这大大提高了单元测试的速度。

10.3。单位测试和实际工作中的集成测试,许多同学使用集成测试而不是单元测试,或者集成测试是单位测试。在这里,总结单元测试和集成测试之间的差异:测试对象不同的单位测试对象是实现特定功能的程序单元,并且集成的测试对象是设计计划中的模块和模块的组合。

测试方法不同单元测试的主要方法基于基于代码的白色盒式测试,并且基于功能的黑盒式测试主要用于集成测试。测试时间不同的集成测试受单元测试。测试内容不同的单元测试主要是测试模块的逻辑,功能,参数传递,可变参考,误差处理和需求和设计的测试,以及设计的具体要求; 综合测试主要验证接口和接口之间的数据传输关系。组合模块后可以实现预期效果。

作者:开发人员助理_LS ALI云云原始内容不得在未经许可的情况下复制。


本文关键词:KOK官网

本文来源:KOK官网-www.song0543.com

        <code id='ayx27'></code><style id='ayx27'></style>
        • <acronym id='ayx27'></acronym>
          <center id='ayx27'><center id='ayx27'><tfoot id='ayx27'></tfoot></center><abbr id='ayx27'><dir id='ayx27'><tfoot id='ayx27'></tfoot><noframes id='ayx27'>

          • <optgroup id='ayx27'><strike id='ayx27'><sup id='ayx27'></sup></strike><code id='ayx27'></code></optgroup>
              1. <b id='ayx27'><label id='ayx27'><select id='ayx27'><dt id='ayx27'><span id='ayx27'></span></dt></select></label></b><u id='ayx27'></u>
                <i id='ayx27'><strike id='ayx27'><tt id='ayx27'><pre id='ayx27'></pre></tt></strike></i>

                
                KOK官网_最新官方入口
                TOP
                导航 电话 短信 咨询 地图 主页