有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java方法别名

我正在开发单元测试,当涉及到测试数据的创建时,它可以从可重用性中受益匪浅。然而,对于相同的测试数据(API参数),我需要做不同的事情(API调用)

我想知道以下习惯用法在Java中是否可行

Class RunTestScenarios {

void runScenarioOne (A a, B b, C c) {
   ........
}

void runScenarioTwo (A a, B b, C c) {
   ........
}

void runScenario (/* The scenario */  scenarioXXX) {
     A a = createTestDataA();
     B b = createTestDataB();
     C c = createTestDataC();
     scenarioXXX(a, b, c);
}

public static void main (String[] args) {
    runScenario(runScenarioOne);
    runScenario(runScenarioTwo);
}

}

基本上,我不想在任何地方重复以下内容:

 A a = createTestDataA();
 B b = createTestDataB();
 C c = createTestDataC();

据我所知,这样的别名(scenarioXXX)是不可能的,但我很乐意被纠正,或者如果有人可以建议可能的设计替代方案来实现这一效果

顺便说一句,我知道命令模式来完成这项工作。但不是我想要的

谢谢, 美国


共 (4) 个答案

  1. # 1 楼答案

    实现这一点的一种方法是使用intefaces:-

    1. 修改runScenario()方法以接受该接口作为参数
    2. 为每个场景类型实现接口,并通过场景测试所需的接口

    通常,java中的单元测试是通过使用jUnit来完成的,如果您还不知道的话。有许多可用的教程,其中一个可以在here找到

  2. # 2 楼答案

    我不确定是否能得到您所需要的,但在我看来,您可以使用TestNG提供的DataProvider

    是这样的:

    ...
    @Test(dataProvider="someMethodWithDataProviderAnnotation") 
    void runScenarioOne (A a, B b, C c) {
    ...
    }
    
    @Test(dataProvider="someMethodWithDataProviderAnnotation") 
    void runScenarioTwo (A a, B b, C c) {
    ...
    }
    

    然后,您可以为您的数据提供商:

    @DataProvider(name="someMethodWithDataProviderAnnotation")
    private Object [][] getTestData() {
       return new Object[]][] {{
             createTestDataA(),
             createTestDataB(),
             createTestDataC()
       }};
     } 
    

    就是这样,当你运行你的测试时,它们会被正确的参数调用,这些参数只会被创建一次。虽然在这个目录中有很多有用的资源,但在这个目录中有很多这样的资源

    您只需运行类中的所有方法

    请在此处阅读更多信息:

    http://testng.org/doc/documentation-main.html#parameters-dataproviders

    顺便说一句:TestNG作为插件包含在Intellj IDEA中

  3. # 3 楼答案

    1. 使用jUnit
    2. 转换a、b及amp;c到字段
    3. 使用jUnit的setUptearDown方法为每个测试初始化新对象
  4. # 4 楼答案

    不,在Java中不能这样做。没有lambda的支持(不要屏住呼吸…)。您可以在Scala中这样做,例如使用ScalaTest。可能在其他一些JVM语言中
    在Java中,习惯用法是用匿名类包装这些函数,可能实现一个定义要运行的方法的接口