Fra*_*ois 0 java unit-testing mockito
与2的Mockito,应当ArgumentMarchers.any()被用来代替像更具体的匹配器ArgumentMatchers.anyString()或ArgumentMatchers.anyList()例如?应该使用特定的匹配器使代码更具可读性吗?
根据经验,使用本机时OBJETS( ,int,long,double),boolean特定的匹配器anyInt(),anyLong(),anyDouble()或anyBoolean()是优选的。但是其他匹配器呢?有任何想法吗?谢谢。
简而言之,在大多数情况下(特别是在Java 8或更高版本中),您可以使用任何一种。any()对于非脆性Mockito测试,通常更惯用,尽管使用anyString或有一些实用的原因和正确性的原因any(String.class)。当心:完整的原理深入研究了Mockito匹配器内部,Java类型参数推断以及大量歇斯底里的葡萄干。
对于像这样的基元anyFloat(),有一个非常实际的理由偏爱anyFloat()etc而不是any():后者将为您提供NullPointerException。对于Mockito语法,如when(floatAcceptor.acceptFloat(any())).then(/*...*/)Mockito,它将实际上调用您的模拟floatAcceptor.acceptFloat(float)方法,并调用any()必要的返回值,null 因为Mockito匹配器必须返回一个虚拟值,而Java没有告诉Mockito足够多的信息使其知道返回float-compatible值。无论Mockito如何,Java都会尝试将a拆箱null到a float并失败。(anyFloat()并any(Float.class) 告诉Mockito期望afloat,以便它们正确返回0.0f。)如果您知道一个值是原始值,装箱值或拆箱值,则调用适当的方法会更安全。
那个原因消失了,List而和String则是贯穿的对象。Java会很乐意传递null来自的any。
在历史上,any相同地表现与any(Class),anyString(),和anyList(Class); 这是一个重要的便利,因为Java 7无法从参数推断类型实参,所以替代方法是(Foo) any()or ArgumentMatchers.<Foo>any()。相比那些,any(Foo.class)更具可读性。对于List来说,情况变得更糟,因为类型文字不支持其他类型,因此any(List.class)甚至无法使用List<Bar>;您可能需要(List<Bar>) any()或ArgumentMatchers.<List<Bar>>any(),但是随身携带便anyList可以anyList(Bar.class)随心所欲。在所有情况下,该参数都将被完全忽略,并且要检查类型,您需要使用isA(Class)它进行反射性的null-rejecting instanceof-style检查。
但是,发生了两处改进,从而改变了这一点:Java 8可以通过parameters高兴地推断出类型实参,因此any()更加有用,Mockito更正了其语法,使其看起来更像英语。用英语,“任何汽车”都不太可能包括自行车或空的停车位,但是在Mockito 1.x中any(Car.class),愉快地将调用与a null或Bicycleinstance 匹配。因此,在Mockito 2.x中,any(String)并且anyString()仅接受非nullString,如GitHub第#185期中所述。与其他所有any(Class)呼叫相同。
最重要的是,Mockito更喜欢灵活的测试,而不是脆弱的测试,因此,您比或更有可能看到any()不相关的Foo参数。如果更改不大可能影响测试行为的参数,则习惯上会忽略不相关的参数。这就是说,和当你知道参数是不是可以可读性是有用的,并且还可以帮助您跟踪长参数列表中通过不编译如果不兼容的方式方法你调用列表的变化。isA(Foo.class)eq(new Foo())anyString()anyList()null
因此,总而言之:对基元使用基元方法,any()尽可能使用基元方法,但请切换到any(Class),,any(List)或者any(String)如果要检查非null类型是否正确,或者要提高可读性,或者需要保持长时间变化的参数列表。
你可以阅读更多的语义any(),any(Class)以及isA对这个问题的GitHub的答案。
| 归档时间: |
|
| 查看次数: |
4317 次 |
| 最近记录: |