Android 使用.setText()对方法进行单元测试

Android 使用.setText()对方法进行单元测试,android,unit-testing,Android,Unit Testing,我尝试在我的android项目中对一个方法进行单元测试。 我尝试在文本视图上设置一个值。 是否可以跳过一行代码,还是必须将其实现为UI测试 这是我尝试测试的方法: public int compareEnteredValue(int batterySize, double valueFromEntry, double batteryArray[]) { int output = 0; for (int i = 0; i <= batteryArray.length - 1;

我尝试在我的android项目中对一个方法进行单元测试。 我尝试在文本视图上设置一个值。 是否可以跳过一行代码,还是必须将其实现为UI测试

这是我尝试测试的方法:

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;
}
public int-compareEnteredValue(int-batterySize,double-valueFromEntry,double-batteryArray[]){
int输出=0;
对于(int i=0;i=batteryArray[i]){
realChargeValue.setText((i*5)+;//这就是单元测试失败的地方
输出=i*5;
}
if(valueFromEntry
您可以进一步细分它。这样您的单元就不会从内部设置文本

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;
}

然后,您就可以在不发布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;
}

然后,您就可以在不发布setText的情况下测试单元。

添加到@doomsnight answer中,通常不需要对代码的每一行进行单元测试。但如果你有足够的热情去测试甚至达到那个水平,下面是你如何实现它的方法。我正在使用一些添加的界面来展示测试

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();
}
公共类可测试类{
私有UIElement realChargeValue;
公共可测试类(UIElement uiElem){
realChargeValue=uiElem;
}
public int compareEnteredValue(int-batterySize,double-valueFromEntry,double-batteryArray[])){
//您需要测试realChargeValue的方法
int输出=0;
对于(int i=0;i=batteryArray[i]){
realChargeValue.setText((i*5)+;//这就是单元测试失败的地方
输出=i*5;
}
if(valueFromEntry
对于测试类,您可以使用以下命令:

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
    }
}
公共类测试{
@试验
public void verify\u compareEnteredValue\u set\u correct\u text(){
ArgumentCaptor ArgumentCaptor=ArgumentCaptor.forClass(String.class);
UIElement dummyuelement=mock(UIElement.class);
doReturn(true).when(dummyuelement).setText(argumentCaptor.capture());
NewTestableClass(dummyUIElement).compareEnteredValue();
List expectedValues=argumentCaptor.getAllValues();
//此处的所有资产是否超过预期值
}
}

添加到@doomsnight answer中,通常不需要对代码的每一行进行单元测试。但如果你有足够的热情去测试甚至达到那个水平,下面是你如何实现它的方法。我正在使用一些添加的界面来展示测试

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();
}
公共类可测试类{
私有UIElement realChargeValue;
公共可测试类(UIElement uiElem){
realChargeValue=uiElem;
}
public int compareEnteredValue(int-batterySize,double-valueFromEntry,double-batteryArray[])){
//您需要测试realChargeValue的方法
int输出=0;
对于(int i=0;i=batteryArray[i]){
realChargeValue.setText((i*5)+;//这就是单元测试失败的地方
输出=i*5;
}
if(valueFromEntry
对于测试类,您可以使用以下命令:

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
    }
}
公共类测试{
@试验
public void verify\u compareEnteredValue\u set\u correct\u text(){
ArgumentCaptor ArgumentCaptor=ArgumentCaptor.forClass(String.class);
UIElement dummyuelement=mock(UIElement.class);
doReturn(true).when(dummyuelement).setText(argumentCaptor.capture());
NewTestableClass(dummyUIElement).compareEnteredValue();
List expectedValues=argumentCaptor.getAllValues();
//此处的所有资产是否超过预期值
}
}

是否尝试模拟TextView和method setText?是否尝试模拟TextView和method setText?我不知道为什么,但这不起作用。如果调用compareEnteredValue后尝试在侦听器中设置文本,则setOnFocusChangeListener()会调用compareEnteredValue方法。该值始终为100 EDIT:我已修复。必须设置返回输出=i*5;返回输出=100@WeSt我想说的是,你的循环有点奇怪,但不确定你想要达到什么。我想这就是单元测试的要点。它将识别返回值是错误的。我不知道为什么,但这不起作用。如果调用compareEnteredValue后尝试在侦听器中设置文本,则setOnFocusChangeListener()会调用compareEnteredValue方法。该值始终为100 EDIT:我已修复。必须设置返回输出=i*5;返回输出=100@WeSt我想说的是,你的循环有点奇怪,但不确定你想要达到什么。我想这就是单元测试的要点。它将识别返回值是错误的。感谢您的回答,末日骑士的回答很简单,并且完成了任务。但这对我将来也有帮助:)谢谢你的回答,末日骑士的回答很简单,而且很成功。但这对我将来也有帮助:)