Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 单元测试不同的类层次结构 什么是最好的方法来做单元测试,考虑不同的类层次结构,比如:_Oop_Unit Testing_Testing_Tdd - Fatal编程技术网

Oop 单元测试不同的类层次结构 什么是最好的方法来做单元测试,考虑不同的类层次结构,比如:

Oop 单元测试不同的类层次结构 什么是最好的方法来做单元测试,考虑不同的类层次结构,比如:,oop,unit-testing,testing,tdd,Oop,Unit Testing,Testing,Tdd,我有一个基类汽车和另一个基类动物 汽车的衍生类别为大众汽车和福特汽车。 动物有派生类Dog和Cat 您将如何开发在运行时决定要使用哪种对象的测试。 考虑到这些测试将应用于数以百万计的对象,在不使用代码复制的情况下实现此类测试的最佳方法是什么 来自不同的阶层 这是向我的一位朋友提出的一个面试问题。这是我以前使用过的一种方法(好吧,这是一种变体) 让我们假设您在Car上有某种通用方法(go),您希望对所有类进行测试,还有一些特定方法(breakDown)在子类中具有不同的行为,因此: public

我有一个基类
汽车
和另一个基类
动物

汽车的衍生类别为大众汽车和福特汽车。 动物有派生类
Dog
Cat

您将如何开发在运行时决定要使用哪种对象的测试。 考虑到这些测试将应用于数以百万计的对象,在不使用代码复制的情况下实现此类测试的最佳方法是什么 来自不同的阶层


这是向我的一位朋友提出的一个面试问题。

这是我以前使用过的一种方法(好吧,这是一种变体)

让我们假设您在Car上有某种通用方法(
go
),您希望对所有类进行测试,还有一些特定方法(
breakDown
)在子类中具有不同的行为,因此:

public class Car {
    protected String engineNoise = null;

    public void go() {
        engineNoise = "vroom";
    }

    public void breakDown() {
        engineNoise = null;
    }

    public String getEngineNoise() {
        return engineNoise;
    }
}

public class Volkswagen extends Car {
    public void breakDown() {
        throw new UnsupportedOperationException();
    }
}
然后,您可以定义一个测试,如下所示:

public abstract class CarTest<T extends Car> {
    T car;

    @Before
    public void setUp() {
        car = createCar();
    }

    @Test
    public void testVroom() {
        car.go();
        assertThat( car.getEngineNoise(), is( "vroom" ) );
    }

    @Test
    public void testBreakDown() {
        car.breakDown();
        assertThat( car.getEngineNoise(), is( null ) );
    }

    protected abstract T createCar();
}

希望有帮助

实际上单元测试指的是方法测试,当您想要编写单元测试时,您必须考虑您想要编写和测试的方法的功能,然后创建类和方法来测试它。通过在设计和编写代码时考虑这种方法,可以创建类的层次结构,也可以创建单个类或任何类型的其他设计


但是,当您必须像上面提到的那样使用现有设计时,最好的做法是对依赖对象使用
接口
基类
,因为通过这种方式,您可以轻松地模拟或存根这些类。

我认为这是一个问题:避免重复公共测试以验证公共基类型的n个派生

  • 创建一个抽象的测试夹具。在这里,您使用抽象方法GetTestSubject()在抽象基类(搜索词“抽象测试夹具”)中编写针对基类型的测试。此类型的派生重写该方法以返回要测试的类型的实例。因此,您需要使用一个重写的方法编写N个子类型,但您的测试只需编写一次
  • 一些单元测试框架(如NUnit)支持“参数化测试”(搜索词)——您必须实现一个方法/属性,该方法/属性将返回测试需要针对的所有对象。然后,它将在运行时对每个这样的对象运行一个/所有测试。这样,您就不需要编写N个派生,只需编写一个方法

测试派生类的基本接口的想法是什么?例如,如果
Car
有一个
startEngine()
和一个
engineIsOn()
方法,请确保
engineIsOn()
在调用
startEngine()
后返回
true
,无论实际使用的是
Car
的哪个派生类。显示一个您想要测试的示例。我不明白你的意思。你的意思是说你有数百万不同的课程?那么,你的第一个答案是这样的?
public class VolkswagenTest extends CarTest<Volkswagen> {
    @Test(expected = UnsupportedOperationException.class)
    public void testBreakdown() {
        car.breakDown();
    }

    protected Volkswagen createCar() {
        return new Volkswagen();
    }
}