2014-12-05 54 views
2

我想要一个简单的模拟,当用给定的参数调用时表现一种方式,而另一种情况下调用其他所有方式。mockito - 如何为不同的参数嘲笑不同的行为

我试过这个变化:

when(this.mockWebElement.findElement(not(eq(By.xpath("./td[1]"))))).thenReturn(this.mockWebElement); 
when(this.mockWebElement.getText()).thenReturn("someString"); 

when(this.mockWebElement.findElement(By.xpath("./td[1]"))).thenReturn(dateMockElement); 
when(dateMockElement.getText()).thenReturn("8/1/2014", "7/1/2014", "6/1/2014", "5/1/2014"); 

getText(By.xpath("./td[1]"))调用总是返回"someString"。我也试过and(eq(any(By.class)), not(eq(By.xpath("./td[1]")))

+0

你的“not()”方法来自哪里?这并不出现在我熟悉的作为有效匹配器的任何版本的Mockito中。 – 2014-12-05 19:56:11

+0

http://mockito.github.io/mockito/docs/current/org/mockito/AdditionalMatchers.html – jordanpg 2014-12-05 19:57:25

回答

0

您可以使用anyString()方法如下

Mockito.when(mockedObject.someMethod(Mockito.anyString())).thenReturn(object1); 
Mockito.when(mockedObject.someMethod(Mockito.eq("anotherString"))).thenReturn(object2); 
+0

我在Mockito API中看不到'getInnerObject'方法。 – jordanpg 2014-12-05 19:58:26

+0

哦,这只是我的例子,对你而言,它是findElement() – kamoor 2014-12-05 20:05:53

+0

更新,使其更清晰 – kamoor 2014-12-05 20:07:26

2

给出使用你的代码为基础,下面的测试通过对我来说:

@Before 
public void setUp() throws Exception { 
    MockitoAnnotations.initMocks(this); 
} 

    @Mock private WebElement mockWebElement; 
    @Mock private WebElement dateMockElement; 

    @Test 
    public void testX() throws Exception { 
     when(this.mockWebElement.findElement(not(eq(By.xpath("./td[1]"))))).thenReturn(this.mockWebElement); 
     when(this.mockWebElement.getText()).thenReturn("someString"); 

     when(this.mockWebElement.findElement(By.xpath("./td[1]"))).thenReturn(dateMockElement); 
     when(dateMockElement.getText()).thenReturn("8/1/2014", "7/1/2014", "6/1/2014", "5/1/2014"); 

     WebElement w = mockWebElement.findElement(By.xpath("./td[1]")); 
     String x= w.getText(); 
     assertEquals("8/1/2014", x); 
    } 

既然你还没有表现出休息的测试,我假设这个错误是在你的实际测试设置和执行的其他部分。

+0

我无法重现我遇到的问题,所以我认为你是对的。感谢您的备份。 – jordanpg 2014-12-05 21:19:07