测试抽象类中的方法一次,而不是针对每个实现

时间:2019-06-11 07:53:23

标签: java junit mockito abstract-class implementation

目前,我有一个实现接口的抽象类。所有实现都扩展了抽象类,以实现接口方法的自己实现。

抽象类包含的方法对于每个实现都是相同的。执行方法。我不想为每个实现类都包含相同的“执行”测试。

我可以通过为一个实现类创建一个测试类来成功测试抽象类中的execute方法。问题在于将有更多的类扩展此抽象类,而我不想在每个这些类中编写相同的执行测试。

我想以某种方式在特定的测试类中仅对抽象类的execute方法进行一次测试,因此我只能测试所有其他类的实现逻辑。

3 个答案:

答案 0 :(得分:0)

您也可以为抽象类创建一个测试类。尽管您不能直接实例化抽象类,但是仍然可以在测试文件中创建一个具体的实现类,仅用于测试抽象类并实现所需的方法。您可以获取一个实例进行测试,例如使用匿名类:

AbstractClassType x = new AbstractClassType() {
    @Override
    public void doSomething() {
        // ...
    }
};

答案 1 :(得分:0)

#example data (use 2m rows from postcode centroid file)
df = pandas.read_csv('National_Statistics_Postcode_Lookup_Latest_Centroids.csv', usecols=[0,1], nrows=2000000)
#this will be our grid of points (or lattice) use points from same file for example
df2 = pandas.read_csv('National_Statistics_Postcode_Lookup_Latest_Centroids.csv', usecols=[0,1], nrows=2000)

#reorder lat long columns for balltree input
columnTitles=["Y","X"]
df = df.reindex(columns=columnTitles)
df2 = df2.reindex(columns=columnTitles)

# assign new columns to existing dataframe. attribute will hold the data we want to sum over (set to 1 for now)
df['attribute'] = 1
df2['aggregation'] = 0

RADIANT_TO_KM_CONSTANT = 6367
class BallTreeIndex:
    def __init__(self, lat_longs):
        self.lat_longs = np.radians(lat_longs)
        self.ball_tree_index =BallTree(self.lat_longs, metric='haversine')

    def query_radius(self,query,radius):
        radius_km = radius/1000
        radius_radiant = radius_km / RADIANT_TO_KM_CONSTANT
        query = np.radians(np.array([query]))
        indices = self.ball_tree_index.query_radius(query,r=radius_radiant)
        return indices[0]

#index the base data
a=BallTreeIndex(df.iloc[:,0:2])
#begin to loop over the lattice to test performance
for i in range(0,100):
    b = df2.iloc[i,0:2]
    output = a.query_radius(b, 200)
    accumulation = sum(df.iloc[output, 2])
    df2.iloc[i,2] = accumulation

因此,上述类我可以通过测试BlaBla类来测试execute()方法。但是将会有更多的类扩展抽象类,我发现将execute()测试只是随机地放在这些类之一中是很丑陋的。

所以我想要一个用于execute和其他测试类的抽象测试,仅用于测试getDataf.e。

答案 2 :(得分:0)

您还可以创建一个参数化的测试类,该类将具有预期结果的实例作为输入并执行测试。 (但是,如果您有很多验证逻辑在不同实例之间存在很大差异,@ vlumi创建抽象测试类的方法可能会更好,因为您可以将验证逻辑移到抽象方法中。)

public class MyParameterizedTests {

    @ParameterizedTest
    @MethodSource("getTestData")
    public void test(TestData data) {
        assertEquals(data.expectedResult, data.instance.compute());
    }

    public static TestData[] getTestData() {
        return new TestData[] { new TestData(new X(), "x"), new TestData(new Y(), "y") };
    }
}

class TestData {
    public MyInterface instance;
    public String expectedResult;

    public TestData(MyInterface instance, String expectedResult) {
        this.instance = instance;
        this.expectedResult = expectedResult;
    }
}

interface MyInterface {
    String compute();
}

class X implements MyInterface {

    @Override
    public String compute() {
        return "x";
    }
}

class Y implements MyInterface {

    @Override
    public String compute() {
        return "y";
    }
}