拥有一组类并访问其方法和属性

时间:2013-08-11 10:26:23

标签: java

我有一个Selenium Webdriver自动化测试项目,我用这种方式构建它:

有两个类是实际测试 有一个类读取生成测试数据并定义了我使用的一些自定义方法 并且有3个“服务”类 - 电子邮件发件人,屏幕截图捕获器和csv阅读器。

现在,如果我能够使用项目中所有类的方法和属性(或者我可以,但我不知道如何),而不必以这种循环方式可笑地扩展,我会喜欢它

所以我现在正在做的是以下

Test1,Test2扩展AppData,扩展了Mailer,扩展了ScreenCapturer,扩展了CSV阅读器。

我确信有一种更优雅的方式可以做到这一点,但它是什么?

PS:你认为我把所有服务放在一个类中只是扩展这个类是一个好主意,如果你这样做 - 为什么?

编辑:我对这个问题得到了很好的答案,所以我删除了我放在这里的第一个代码实例,因为现在我的问题已经略有改变了。

编辑:好的,我现在正在尝试这些新东西,这就是困扰我的。

我有这个AppData类,它包含一个方法randomizer(int min,int max):

public abstract class AppData { 
    public int randomizer(int min, int max) {
        int d = (max - min) + 1;
        int c = min + (int) (Math.random() * ((d)));
        return c;
    }

}

在另一个类 - AppTest中,我想使用随机数发生器:

public class AppTest { //extends AppData 
      private AppData appdata;

    public void someVoid() {

            int randomNumber = appdata.randomizer(1, 99999);
            int randomUser = appdata.randomizer(1, 250); 
            int randomPlace = appdata.randomizer(1, 65);
    }
}

我这样做了吗?我应该把“appdata”。每次我提到随机数发生器之前? 在我能够完全调用它之前,我必须从randomizer方法中删除“静态”修饰符。 我使用这种方法很多。同样的做法适用于变量吗?

然后我必须使用这套15种自定义方法,总是放“appdata”似乎不方便。到处。我确定我做得不对。

        focus();
        fillByName("user[first_name]", firstUserFirstName);
        fillByName("user[last_name]", firstUserLastName + randomNumber);
        fillByName("user[email]", firstUsersEmail);
        fillByName("user[password]", password);
        submitByName("user[password]");

1 个答案:

答案 0 :(得分:1)

您正在寻找的是(可能)Dependency Injection。不要创建一个继承类链,但如果需要,请注入“服务”类。体育在AppTest3注入AppData的构造函数中。

您可能需要Factories来创建类(包含所有注入的依赖项)。

public class Mailer {
    public void sendMailWithAttachment(
        String attachment
    ) {
        //code here
    }
}

public class AppTest3 {
    private Mailer mailer;
    public AppTest3 (
        Mailer mailer
    ) {
       this.mailer = mailer;
    }
    public void run() {
        // do some crazy things here and
        this.mailer.sendMailWithAttachment(
            "crazy file content"
        );
    }
}

public class AppTest3Factory {
    public AppTest3 createAppTest3() {
       return new AppTest3(
          new Mailer();
       );
    }
}

public class Main {
    public static void main(
        String [] args
    ) {
        AppTest3Factory appFactory = new AppTest3Factory();
        AppTest3 app = appFactory.createAppTest3();
        app.run();
    }
}