2017-08-06 36 views
0

我已經開始學習JUNIT。 這是我想要實現的。 我有一個類,它檢查inputString是否是secretKey的一部分;MockedObject和Real Object給出了不同的結果

public class StringChecker { 


public boolean isEqual(String name) 
{ 
    boolean isEqual = false; 
    if(getSecretKey().contains(name)) 
    { 
     isEqual = true; 
    } 

    return isEqual; 
} 

public String getSecretKey() 
{ 
    return "OSKAR"; 
} 

} 

我的測試類是這個

public class RandomCheck { 

@Test 
public void isEqualTest() 
{ 
    StringChecker stringChecker = mock(StringChecker.class); 

    when(stringChecker.getSecretKey()).thenReturn("james"); 

    //assertEquals(true, new StringChecker().isEqual("OSKAR"));  <----this test case passes 

    assertEquals(true, stringChecker.isEqual("james")); 

} 

} 

當我用嘲笑對象時,它並沒有給我預期的結果,因此未能通過測試。但是當我使用一個真實的物體時,它會給我預期的結果並通過測試。 我錯過了什麼?像任何註釋

回答

2

mockito模擬是一個具有模擬類接口的對象,但不是它的實現。你的StringChecker被嘲笑,這意味着沒有實現代碼從isEqualgetSecretKey的呼叫,如你所想。

你可以使用的Mockito spy,見this SO question

Mockito.spy()是創造局部嘲笑的推薦方式。原因是它保證真正的方法被稱爲正確構造的對象,因爲你負責構造傳遞給spy()方法的對象。

+0

我不明白 。你在問或告訴解決方案? –

+0

它的答案。一旦你嘲笑課堂,它不再是真實的東西(物體)。所以'StringChecker'內部的實現代碼不太好。你在'getSecretKey'上設置一個模擬的返回值,但不在'isEqual'上。 –

+0

如果你想在你的例子中進行測試,你可以使用mockito'spy',在那裏你選擇性地只模擬一部分課程,並保持其餘部分'真實'。 –

0

新手的錯誤

這裏的新秀的錯誤,我做了(由Arnold提到)。
我嘲笑StringChecker類,但我沒有爲的isEqual (String)方法提供任何實現
由於沒有實現,我得到了默認值。在這種情況下,false(返回類型的方法是boolean)。

使用靜態方法間諜()。 (再次由@Arnold提及)。
所以這裏是我的工作代碼的樣子。

@Test 
public void isEqualTest() 
{ 
    StringChecker stringChecker = new StringChecker(); 

    StringChecker spy = spy(stringChecker); 

    when(spy.getSecretKey()).thenReturn("james"); // providing implementation for the method 

    assertEquals(true, spy.isEqual("james")); 

} 

什麼,我從中學到了什麼。

只需通過嘲諷的對象沒有得到你的事情做好,如果你打算使用嘲笑對象的方法(簡單來說提供實施爲嘲笑對象的方法)。

TIP

如果你想看到的嘲笑對象返回的默認值,只需調用嘲笑對象在系統輸出的方法(沒有給出實現)。
希望這將有助於像me.Peace

0

的另一種方式的人嘲笑沒有與其他測試情況:

@Test 
public void isEqualTest() { 
    StringChecker stringChecker = new StringChecker() { 
     @Override 
     public String getSecretKey() { 
      return "james"; 
     } 
    }; 

    assertTrue(stringChacker.isEqual("james")); 
    assertTrue(stringChacker.isEqual("jam")); 
    assertTrue(stringChacker.isEqual("mes")); 
    assertFalse(stringChacker.isEqual("oops")); 
} 

順便說一句,在isEqual()可以簡化爲一條線:

public boolean isEqual(String name) { 
    return getSecretKey().contains(name); 
} 
相關問題