2015-01-15 42 views
0

我有一些單元測試寫在spock框架中。但是我的測試總是正確的,即使我傳遞了錯誤的值。爲什麼模擬方法總是正確的?

class CalculatorTest extends Specification { 

def "Method should return roman number"() { 
    given: 
     CalculatorApi romanCalculator = Mock() 
    when: "I add two numbers as integer" 
     romanCalculator.add(2, 2) 
    then: "Method should return roman number as String" 
     romanCalculator.add(2, 2) >> 32131 
} 

方法「add」應該返回String。在這個測試中,一個方法應該返回Integer。

public class RomanCalculator implements CalculatorApi { 

private RomanConverter romanConverter; 

public RomanCalculator() { 
    this.romanConverter = new RomanConverter(); 
} 

public String add(int one, int two) throws OperationFail { 
    int number = one + two; 

    try { 
     return romanConverter.convertNumber(number); 
    } catch (NumberNotFound e) { 
     throw new OperationFail(e.getMessage()); 
    } 
} 


public class RomanConverter implements ConverterApi { 

public String convertNumber(Integer number) throws NumberNotFound { 

    switch(number) { 
     case 1: 
      return "I"; 
     case 2: 
      return "II"; 
     case 3: 
      return "III"; 
     case 4: 
      return "IV"; 
     case 5: 
      return "V"; 
     case 6: 
      return "VI"; 
     case 7: 
      return "VII"; 
     case 8: 
      return "VIII"; 
     case 9: 
      return "IX"; 
     case 10: 
      return "X"; 
     default: 
      throw new NumberNotFound(); 
    } 
    } 

爲什麼這種方法不工作?我剛開始學習模擬單元測試。

+0

這是什麼碼手段? 'romanCalculator.add(2,2)>> 32131' – roeygol

+0

嘲笑你正在測試的類是毫無意義的。 –

+0

這意味着參數爲2和2的方法應返回值32131 – dejmien25

回答

2

問題是:爲什麼你應該嘲笑?模擬用於確保沒有其他依賴項,以便測試特定的方法。所有的外部依賴可以被模擬以避免問題(E.G數據庫連接:你想測試一個使用從數據庫檢索的數據的邏輯,所以你想模擬執行數據庫請求的對象)。 另外,請添加您使用的模擬庫的細節。

這裏你要說的是,如果你用參數(2,2)調用你的方法,它將返回羅馬計算器(2,2)的執行,這是錯誤的。你不是在這裏測試,Mock不是用來測試你想測試的類,而是用來簡化另一個對象,並在安全和受控的環境中測試你的方法。 例如:

Instance retrieve = new Instance() 

method doSomething() { 
    retrievedVal = retrieve.retrieveFromDB(something) 
    return transform(retrievedVal) 
} 

您的測試應該是:

test() { 
    Instance retrieve = mock() 
    when retrieve(specific something).thenReturn(specificRetrievedVal) 

    test doSomething() 
} 

我避免了完整的,完全例子可以讓你瞭解你需要究竟如何做,試試:)

+0

好的謝謝..我的問題發生,因爲我不明白嘲笑的想法。謝謝! – dejmien25

相關問題