2013-10-18 139 views
1

我是新来的Android的测试,并已决定通过实例的Mockito从http://docs.mockito.googlecode.com/hg/latest/org/mockito/Mockito.html#3参数匹配不验证参数

工作要充分认识发生了什么事情开始,我已经决定从分支出来例如,这是我的代码:

@Test 
public void testMatchers() throws Exception 
{ 
    LinkedList <String> mockedList = mock (LinkedList.class); 
    when (mockedList.contains(argThat(isValidStr()))).thenReturn(true); 
    System.out.println(mockedList.contains("Asdf")); // prints 'true', as expected 
    System.out.println(mockedList.contains("asdf")); // prints 'true' which I guess makes sense... but shouldn't the argument matcher complain somehow? 

} 
public static ArgumentMatcher<String> isValidStr() 
{ 
    return new ArgumentMatcher<String>() 
    { 
    @Override 
    public boolean matches (Object argument) 
    { 
     String str = (String) argument; 
     return (str.charAt(0) > 'A' || str.charAt(0) < 'Z') // if first letter is capitalized 
    } 
    } 
} 

所有测试都通过,有0个例外/错误。另外,我在“匹配”功能的开始处放置了一个断点,并且它永远不会被击中。

3个问题: 1)为什么我的参数匹配器不抱怨错误的争论?
2)检测到错误的参数后,预期的输出是多少? 3)代码如何看起来像检测一个不合适的参数?

回答

1
  1. 我不知道为什么你的断点不点火,但是我扔在匹配一个System.out.println("Hello")断点,它被击中就好了。事实证明,在您的测试中,“asdf”和“Asdf”都是匹配的,因为您在匹配器中的条件是||而不是&&。有一次,我纠正了,并切换到>=<=代替><

    return (str.charAt(0) >= 'A' && str.charAt(0) <= 'Z'); 
    

    ...然后我得到分别与truefalse,符合市场预期。

    需要注意的是它的安全一样ListDeque模拟接口,而不是具体的类象LinkedList,因为具体的类可以有默默的Mockito不能嘲笑最终方法。由于您使用的匹配在when声明(在现实世界中的非示例测试你应该使用一个真正的LinkedListtest state instead of interaction。)

  2. ,你设置的匹配相匹配时,预期的行为。如果不匹配,如果您没有设定其他期望,Mockito会返回default boolean return value,false

  3. Unlike EasyMock's record-replay pattern,在测试过程中积极捕捉不良相互作用,的Mockito有存根测试验证模式,对于不良的相互作用只有“检查”,如果你手动要求它这样做:

    // Verify that contains is never called with an invalid string. 
    verify(mockedList, never()).contains(argThat(not(isValidStr())); 
    

    通过约定,这将在你的测试结束。另一个明显的验证应该是这样的:

    verify(mockedList).contains(argThat(isValidStr())); 
    

    ...但是这实际上会通过,因为它会与“ASDF”匹配您的第一个电话,而忽略你用“ASDF”第二个电话。您可以通过在上面的验证中添加verifyNoMoreInteractions(mockedList)来解决此问题,但通常那些默认值(如falsenull)无论如何都会破坏您的测试断言或系统测试。