【问题标题】:JUnit test if else caseJUnit 测试 if else 情况
【发布时间】:2016-10-27 06:52:46
【问题描述】:

如何将测试写入当前方法?我使用 jUnit 4。

   public void setImage() {
        if(conditionOne){
            myView.setImageOne();
        } else {
            myView.setImageTwo();
        }
    }

【问题讨论】:

  • 您的目标是通过单元测试实现 100% 的代码覆盖率,因此需要进行两次测试。
  • 你能展示这些测试的示例代码吗?
  • 旁注:不必写== true,写if (conditionOne) {即可。
  • 到目前为止你尝试过什么? -- github.com/junit-team/junit4/wiki/Getting-started
  • 我正在尝试根据我的情况设置不同的图像

标签: java testing junit junit4 android-testing


【解决方案1】:

您需要编写两个测试来涵盖以下两种情况:

import org.junit.Test;

public class SetImageTest {

    @Test
    public void testSetImageForConditionOne() {
        //write test to make conditionOne true
    }

    @Test
    public void testSetImageForElseCondition() {
        //write test to make conditionOne false
    }
}

【讨论】:

  • 这不是答案
  • 您能否详细说明您的问题?
  • 您好...我的问题以“如何将测试写入当前方法?”开始
  • @TeodorKolev 但是您没有说明,到目前为止您已经尝试了什么以及您在测试此方法时遇到的实际问题是什么。见How to ask
  • 被测方法和测试方法之间没有一对一的映射关系。一个方法可能有 n 个测试方法来测试它在不同参数下的功能。在javaguy分享的代码中,该方法有两个对应的test-method,一个用于测试if block是否正常工作,另一个用于测试else block是否正常工作。
【解决方案2】:

好的...您编写此方法的方式存在缺陷。有一种叫做可测试代码的东西。这是一个讨论可测试代码的链接 (how to write testable code and why it matters)。

你上面写的方法是不确定的。这意味着该方法可以在不同的运行中表现出不同的行为,即使它具有相同的输入。在你的情况下,你没有输入。

目前,您的原始方法基于方法的环境而不是输入。这种做法会使为您的代码编写适当的测试变得非常困难,在某些情况下甚至不可能。

这就是你想要的样子......

  public void setImage(boolean conditionOne) {
    if(conditionOne){
        myView.setImageOne();
    } else {
        myView.setImageTwo();
    }
}

既然测试是确定性的,您要么必须测试环境中的变量,要么有一个返回语句。

所以(添加一个 return 语句)你可以这样做。

  public static void setImage(boolean conditionOne, type myView) {
    if(conditionOne){
        myView.setImageOne();
    } else {
        myView.setImageTwo();
    }
    return myView; 
  }

现在你的测试看起来像这样

public class SetImageTest {
  @Test
  public void testSetImage() {
    type myViewOrig;
    //define myViewOrig
    type myView1;
    //define myView1
    type myView2;
    //define myView2

    assertEquals(setImage(<true>, type myViewOrig), myView1);
    assertEquals(setImage(<false>, type myViewOrig), myView2);
  }
}

或者您可以在运行 setImage 方法后测试 myView 对象。

【讨论】:

  • setImage 方法有返回值,但签名无效。它需要返回视图而不是无效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-08
  • 1970-01-01
  • 2016-08-16
  • 1970-01-01
相关资源
最近更新 更多