2017-07-17 50 views
0

我嘗試在我的android項目中單元測試一個方法。 一切工作單位我嘗試在TextView上設置一個值。 是否可以跳過一行代碼,或者是否必須將其作爲UI測試來實現?使用.setText()的方法進行單元測試

這是我嘗試測試方法:

public int compareEnteredValue(int batterySize, double valueFromEntry, double batteryArray[]) { 
    int output = 0; 
    for (int i = 0; i <= batteryArray.length - 1; i++) { 
     if (valueFromEntry >= batteryArray[i]) { 
      realChargeValue.setText((i * 5) + ""); // This is where the unit test fails 
      output = i*5; 
     } 
     if (valueFromEntry < batteryArray[batteryArray.length - 1]) { 
      realChargeValue.setText(R.string.hundredPercent); 
      output = 100; 
     } 
    } 
    return output; 
} 
+0

你嘗試嘲笑的TextView和方法的setText? – DeKaNszn

回答

1

你可以進一步打破它。以便您的單位不會從內部設置文字。

public int compareEnteredValue(int batterySize, double valueFromEntry, double batteryArray[]) { 
    int output = 0; 
    for (int i = 0; i <= batteryArray.length - 1; i++) { 
     if (valueFromEntry >= batteryArray[i]) { 
      //realChargeValue.setText((i * 5) + ""); // This is where the unit test fails 
      output = i*5; 
     } 
     if (valueFromEntry < batteryArray[batteryArray.length - 1]) { 
      //realChargeValue.setText(R.string.hundredPercent); 
      output = 100; 
     } 
    } 
    return output; 
} 

然後在那裏你調用方法..

int value = compareEnteredValue(....); 
if(value == 100) 
    realChargeValue.setText(R.string.hundredPercent); 
else 
    realChargeValue.setText(value + ""); 

然後,您可以用沒有的setText的問題,測試單元。

+0

我不知道爲什麼,但這不起作用。 compareEnteredValue方法由setOnFocusChangeListener()調用如果我在調用compareEnteredValue之後試圖在listener中設置setText,該值始終爲100 EDIT:我修正了它。你必須設置返回輸出= i * 5;並返回輸出= 100; – WeSt

+0

@WeSt我想提到你的循環有點奇怪,但並不確定你試圖達到什麼目的。我想這就是單元測試的重點。它會確定返回值是錯誤的。 – Doomsknight

1

添加@Doomsknight答案時,通常不需要單元測試代碼的每一行。但是如果你足夠熱情地測試,甚至達到這個水平,這裏是你如何實現它。我正在使用一些添加的接口來展示測試。

public class TestableClass{ 
    private UIElement realChargeValue; 

    public TestableClass(UIElement uiElem){ 
     realChargeValue = uiElem; 
    } 

    public int compareEnteredValue(int batterySize, double valueFromEntry, double batteryArray[]) { 
     //Your method which needs to test realChargeValue 

     int output = 0; 
     for (int i = 0; i <= batteryArray.length - 1; i++) { 
      if (valueFromEntry >= batteryArray[i]) { 
       realChargeValue.setText((i * 5) + ""); // This is where the unit test fails 
       output = i*5; 
      } 
      if (valueFromEntry < batteryArray[batteryArray.length - 1]) { 
       realChargeValue.setText(R.string.hundredPercent); 
       output = 100; 
      } 
     } 
     return output; 
    } 
} 

public interface UIElement{ 
    boolean setText(); 
} 

對於測試類,您可以使用如下:

public class Test{ 
    @Test 
    public void verify_compareEnteredValue_sets_correct_text(){ 
     ArgumentCaptor<String> argumentCaptor = ArgumentCaptor.forClass(String.class); 
     UIElement dummyUIElement = mock(UIElement.class); 
     doReturn(true).when(dummyUIElement).setText(argumentCaptor.capture()); 

     new TestableClass(dummyUIElement).compareEnteredValue(); 

     List<String> expectedValues = argumentCaptor.getAllValues(); 
     //do all asserts here over expectedValues 
    } 
} 
+0

謝謝你的回答,Doomsknight的回答很簡單,並且完成了這項工作。但這可以幫助我在未來:) – WeSt