mockito - 如何模拟不同参数的不同行为

时间:2014-12-05 19:17:12

标签: java unit-testing mocking 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]")))

2 个答案:

答案 0 :(得分: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);
    }

由于您没有显示测试的其余部分,我假设错误是在实际测试设置和执行的其余部分中。

答案 1 :(得分:0)

您可以使用下面给出的anyString()方法

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