簡體   English   中英

Mockito存根無效方法

[英]Mockito stubbing void methods

我目前正在為我的硒項目編寫單元測試,並且正在使用Mockito模擬我的webelements和驅動程序。

我遇到的問題是我有一個用於更改單選按鈕列表中的單選選項的功能,但是我對此有疑問。 代碼如下:

@Test
public void testChangeRadioState(){
    WebElement mockElement           = mock(WebElement.class);
    List<WebElement> mockElementList = new ArrayList<>();
    WebElement selectedMockElement   = mock(WebElement.class);


    /*The when statements*/
    when(selectedMockElement.isSelected()).thenReturn(true);
    doReturn(when(mockElement.isSelected()).thenReturn(true)).when(mockElement).click();
    doReturn(when(selectedMockElement.isSelected()).thenReturn(false)).when(mockElement).click();

   /*Add a selected and a none selected element to the list*/
    mockElementList.add(mockElement);
    mockElementList.add(selectedMockElement);

    /*The method that is beeing tested*/
    elementSetter.changeRadioState(mockElementList);

    Assert.assertTrue("The radio state was not selected",mockElement.isSelected());
}

我要在doReturn部分做的是告訴元素“ mockElement”,當它收到單擊時,應該始終在isSelected()調用上返回true。 但由於Click()是一個無效函數,因此我不允許這樣做。 有人知道解決方法嗎?

好的,這是一個單獨的主題-您正在測試什么,我將深入探討一下。

我只是這樣重寫測試:

@Test
public void testChangeRadioState() {
    WebElement mockElement           = mock(WebElement.class);
    WebElement selectedMockElement   = mock(WebElement.class);
    List<WebElement> mockElementList = new ArrayList<>();

    /*The when statements*/
    when(selectedMockElement.isSelected()).thenReturn(true);
    // By default mockito will return false but maybe I want to highlight 
    // that this is important
    when(mockElement.isSelected()).thenReturn(false);

    /*Add a selected and a none selected element to the list*/
    mockElementList.add(mockElement);
    mockElementList.add(selectedMockElement);

    /*The method that is beeing tested*/
    elementSetter.changeRadioState(mockElementList);

    verify(selectedMockElement).click();
    // according to test method name I would add 
    // one more verification that something was dis-selected
}

我認為具有狀態的另一個變體具有不必要的模擬:

boolean selected;
@Test
public void testChangeRadioState() {
    selected = false;
    WebElement mockElement           = mock(WebElement.class);
    WebElement selectedMockElement   = mock(WebElement.class);
    List<WebElement> mockElementList = new ArrayList<>();

    /*The when statements*/
    when(selectedMockElement.isSelected()).thenReturn(true);
    doAnswer(new Answer<Object>() {
        public Object answer(InvocationOnMock invocation) {
            selected = true;
            return null;
        }
    }).when(mockElement).click();
    /*Add a selected and a none selected element to the list*/
    mockElementList.add(mockElement);
    mockElementList.add(selectedMockElement);

    /*The method that is beeing tested*/
    elementSetter.changeRadioState(mockElementList);

    Assert.assertTrue("The radio state was not selected", selected);
    // according to test method name I would add 
    // one more verification that something was dis-selected
}

但是名字再次引起誤解。 例如,我希望某些元素在單擊時不會被選中 再次詢問您要測試的內容

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM