使用泛型类型传递特定的类

时间:2018-11-23 03:59:34

标签: java json

我对编程语言很陌生。我的问题甚至没有道理。我的环境正在使用Java,并试图在同一自动化测试框架中同时实现ios和android应用。 因此,想法是任何测试脚本都应该能够在两个应用程序上运行。例如:一个登录测试脚本应同时在ios和android上运行。 我决定使用接口和类实现方法。我面临的问题是测试数据。我的公司不想使用excel。他们想将json用于测试数据。

这是我的问题,请看下面的代码行:

ValidBuy goodBuy = JsonFileReader.loadDaTa(TestBase.DATA_PATH, "good-buy.json", ValidBuy.class);

您可以看到我有一个“ ValidBuy”类,其中包含特定json文件的所有获取器。我还有另一个类“ JsonFileReader”,它将json filePath,fileName和一个类作为输入,并返回我传入的该类名称的数据。对于此示例,我已经传递了ValidBuy.class

因此,当我运行阳性测试时,我正在传递类型为“ ValidBuy”的“ goodBuy”变量。问题从这里开始。 现在,用来自goodBuy的数据指定了测试用例,因为它的类型是“ ValidBuy”,并且我要传递goodBuy作为参数。

看看我提取的方法之一:

private void enterBuyInfo(ValidBuy goodBuy) {
    itemPage = nativeApp.getItemPage(goodBuy);
    itemPage.setItemName(goodBuy.getItemName());
    itemPage.setItemSize(goodBuy.getItemSize());
    itemPage.setItemDigitSSN(goodBuy.getSsn());
    itemPage.clickContinue();
}

您可以看到我正在使用的那些getter来自ValidBuy类。 如果我使用badBuy的数据运行此测试:

InvalidBuy badBuy = JsonFileReader.loadDaTa(TestBase.DATA_PATH, "bad-buy.json", InvalidBuy.class);

它失败了,因为现在我必须将“ ValidBuy”类更改为“ InvalidBuy”类。既然无法在每次运行中更改提取方法中的参数,那么如何使它更通用?

我想要这样的东西:

TestData data = JsonFileReader.loadDaTa(RESOURCES_PATH, "good-client.json", InvalidBuy.class);

此处,TestData是通用的。它可以是类,也可以是接口(我不知道是否可行),返回类型将由我传递给loadData()方法的任何类指定。在这种情况下,InvalidBuy.class

The extracted method should look like this:

private void enterBuyInfo(TestData data) {
    itemPage = nativeApp.getItemPage(data);
    itemPage.setItemName(data.getItemName());
    itemPage.setItemSize(data.getItemSize());
    itemPage.setItemDigitSSN(data.getSsn());
    itemPage.clickContinue();
}

如果可以,我可以使用这些提取的方法来创建更多测试。

我知道我写了很多。我只是试图使其尽可能清楚。如果没有任何意义,请忽略它。

任何建议,想法和代码示例都将受到高度赞赏。

1 个答案:

答案 0 :(得分:0)

首先让我看看我是否理解您的问题。我想您是说loadData可能返回类型ValidBuyInvalidBuy的值,并且您想将要返回的类传递给它。然后,您想知道如何在测试方法中使用可能表示这些类之一的接口,以便可以测试各种返回值(有效值和无效值)。您在问题中使用了“泛型”一词,但我想您并不是要以Java中使用的特定方式来使用它。

如果我正确理解了您的问题,那么这里是一个答案:

将您希望返回的类传递给方法是一种不寻常的用法,几乎可以肯定是不理想的。更好的OOD方法是将loadData返回的所有对象的通用方法提取到接口中。

所以:

interface Buy {
    String getItemName();
    boolean isValid();
}

class ValidBuy implements Buy {
    @Override
    public boolean isValid() {
        return true;
    }
    ...
}

class InvalidBuy implements Buy {
    @Override
    public boolean isValid() {
        return false;
    }
    ...
}

class JsonFileReader {
    Buy loadData(Path path) {
        ...
    }
}

然后您的测试如下所示:

@Test
void testValidBuy() {
    assertTrue(reader.loadData(validPath).isvalid());
}

@Test
void testInvalidBuy() {
    assertFalse(reader.loadData(invalidPath).isValid());
}    

我意识到我已经对其进行了一些简化,但是希望您能理解。