当前位置: 首页 > 知识库问答 >
问题:

设计junit测试用例-每个测试用例的预定义步骤

郗鹏
2023-03-14

我对如何设计junit测试用例以使其更具可读性和可维护性感兴趣。问题是——在我所有的junit测试用例中,我都有一些预定义的步骤要执行,如下所示

public class MyTestClass {

private Service myService;

@Test
public void testCase1() {
    mockObjectX("A");
    mockObjectY(1);
    mockObjectZ("M", 1);

    myService.validate("value1", "value2");

}

@Test
public void testCase2() {
    mockObjectX("Q");
    mockObjectY(5);
    mockObjectZ("Z", 10);

    myService.validate("value3", "value4");

}


private void mockObjectZ(String value1, int value2) {
    //mock object Z
}

private void mockObjectY(Integer value) {
    //mock object Y
}

private void mockObjectX(String value) {
    //mock object X
}
}

问题是,如果要添加新的测试用例,我需要确保新的测试用例调用mockObjectX()、mockObjectY()、mockObjectZ()。有没有更好的方法(更易于维护的方法)来设计我的测试用例,以便添加新的测试用例变得更简单?

我认为不能使用@之前,因为mock*方法接受参数。

我可以想到的一种方法是使用一个类,该类包含模拟对象X、Y和Z所需的每个参数值的方法

public class MyTestClass {

private Service myService;

@Test
public void testCase1() {
    mockObjects(new TestCase1());
    myService.validate("value1", "value2");

}

@Test
public void testCase2() {
    mockObjects(new TestCase2());
    myService.validate("value3", "value4");

}

private void mockObjects(ServiceObjectMocker serviceObjectMocker) {
    //mock object x, y and z by calling respective methods from serviceObjectMocker   
}  

private class ServiceObjectMocker {

    protected Object[] getValuesForObjectZ() {
        //pass default values
        return new Object[] {};     
    }

    protected Integer getValuesForObjectY() {
        //pass default values
        return 1;
    }

    protected String getValuesForObjectX() {
        //pass default values
        return "A";
    }

}

private class TestCase1 extends ServiceObjectMocker {
    @Override
    protected String getValuesForObjectX() {
        return "B";    
    }  
}

private class TestCase2 extends ServiceObjectMocker {
    @Override
    protected String getValuesForObjectX() {
        //pass different values
        return "Q";
    }

    @Override
    protected Integer getValuesForObjectY() {
        //pass default values
        return 10;
    }

}
}

这减少了每个测试用例需要进行的方法调用的数量。有更好的想法吗?

共有1个答案

柳项明
2023-03-14

如果您每次都在做相同的事情,那么只是数据不同,然后看看@参数化。

然后,您可以有类似的内容(未测试和未编译):

@RunWith(Parameterized.class)
public class MyTestClass {
  @Parameters
  public static List<Object[]> data() {
      return Arrays.asList(new Object[][] {
          { "A", 1, "M", 1, "value1", "value2" },
          { "Q", 5, "Z", 10, "value3", "value4" },
      });
  }

  private String xValue;
  private int yValue;
  private String zValueString;
  private int zValueInt;
  private String expected1;
  private String expected2;

  public MyTestClass(String xValue, int yValue, String zValueString, int zValueInt, String expected1, String expected2) {
    this.xValue = xValue;
    this.yValue = yValue;
    this.zValueString = zValueString;
    this.zValueInt = zValueInt;
    this.expected1 = expected1;
    this.expected2 = expected2;
  }

  @Test
  public void test() {
    mockObjectX(xValue);
    mockObjectY(yValue);
    mockObjectZ(zValueString, zValueInt);

    myService.validate(expected1, expected2);
  }
}

然后只定义一次测试。

 类似资料:
  • 问题内容: 我在Java中有一个测试类,在其中有@Test注释的几种方法,以某种方式,当我运行整个测试时,我想在方法B之前先运行Junit方法A。有可能还是有必要? 问题答案: 这种对测试方法的依赖是不好的设计,应该避免。如果一个测试方法中有初始化代码需要为下一个测试方法完成,则应将其分解为setUp方法。

  • 我有一个简单的测试用例: FileManager中的函数删除 /myDir下的所有文件,然后再次保留文件。 如上所述,我有一个。运行时,我可以按以下顺序查看所有打印: 但是,测试在失败。有两件事我不明白: > 我不明白,它在中失败了,为什么我仍然可以看到打印的,听起来就像是失败了,它没有停止运行,而是继续运行下一个测试?JUnit测试用例中的场景背后发生了什么?? 我不明白的另一件事是为什么tes

  • 我是新的火花与Java编程。我有一个从Oracle数据库读取数据的方法。现在我需要帮助编写测试用例使用JUnit框架为下面的代码。 数据集df=spark。read()。格式(“jdbc”)。jdbc(jdbcUrl、dbTable1、connectionProperties);

  • 我对junit mockito非常陌生,并尝试使用mockito编写junit测试用例。 这是我的方法,我必须为此编写一个jUnit。 ChefService和ChefApi传递的方法参数来自第三方api 这里是呼叫chefService。listCookbookVersions()将返回CookBookVersion类类型的迭代器,如

  • 本文向大家介绍如何设计测试用例?什么样子的测试用例是好用例?相关面试题,主要包含被问及如何设计测试用例?什么样子的测试用例是好用例?时的应答技巧和注意事项,需要的朋友参考一下 掌握边界值分析、等价类划分、错误推测等方法来设计测试用例 是一个完备的集合,它能够覆盖所有等价类以及各种边界值;需要从软件功能需求出发,全面地,无遗漏地识别出测试需求;最好是代码覆盖测试也全面的测试

  • 我正在为我的项目创建junit测试用例。我有下面的代码,我想在其中创建一个模拟, 我正在使用jUnit和mockito核心jar。我尝试了下面的代码, 使用上述代码,它在模拟loadProperties方法时抛出错误。如何模拟Spring静态类并返回我的模拟属性对象? 任何帮助都将不胜感激。