制作考虑不同类层次结构的单元测试的最佳方法是什么,例如:
我有一个基类Car
和另一个基类Animal
。
Car拥有派生类VolksWagen
和Ford
。
Animal拥有派生类Dog
和Cat
。
您如何开发测试,在运行时决定您将使用哪种对象。 考虑到这些测试将应用于数百万个对象,在不使用代码复制的情况下实现这些测试的最佳方法是什么 来自不同的等级?
这是向我的一位朋友询问的面试问题。
答案 0 :(得分:1)
我看到的问题:避免重复常用测试来验证公共基类型的n个派生。
答案 1 :(得分:0)
这是我之前使用的一种方法(嗯,这是一种变体)。
假设您在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();
}
现在,由于Volkswagen
需要在testBreakDown
方法中执行不同的操作 - 并且可能还有其他需要测试的方法 - 因此您可以使用以下VolkswagenTest
。< / p>
public class VolkswagenTest extends CarTest<Volkswagen> {
@Test(expected = UnsupportedOperationException.class)
public void testBreakdown() {
car.breakDown();
}
protected Volkswagen createCar() {
return new Volkswagen();
}
}
希望有所帮助!
答案 2 :(得分:0)
实际单元测试是指方法测试,当您想要编写单元测试时,您必须考虑要编写和测试的方法的功能,然后创建用于测试的类和方法。通过在设计和编写代码时考虑这种方法,可能会创建类的层次结构,或者只创建单个类或任何类型的其他设计。
但是当您必须像上面提到的那样使用现有设计时,最佳做法是使用Interfaces
或Base Classes
作为依赖对象,因为通过这种方式,您可以模拟或存根这些类容易。