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();
}
}