进行考虑不同类层次结构的单元测试的最佳方法是什么,例如:
我有一个基类Car
和另一个基类Animal
。
Car 具有派生类VolksWagen
和Ford
. Animal 有派生类Dog
和Cat
.
您将如何开发在运行时决定您将使用哪种对象的测试。考虑到这些测试将应用于来自不同层次结构的数百万个对象,在不使用代码复制的情况下实现此类测试的最佳方法是什么?
这是我的一个朋友问的一个面试问题。
进行考虑不同类层次结构的单元测试的最佳方法是什么,例如:
我有一个基类Car
和另一个基类Animal
。
Car 具有派生类VolksWagen
和Ford
. Animal 有派生类Dog
和Cat
.
您将如何开发在运行时决定您将使用哪种对象的测试。考虑到这些测试将应用于来自不同层次结构的数百万个对象,在不使用代码复制的情况下实现此类测试的最佳方法是什么?
这是我的一个朋友问的一个面试问题。
我看到的问题:避免重复常见的测试来验证一个常见的基本类型的 n 派生。
这是我以前使用过的一种方法(嗯,它的一种变体)。
假设您go
在 Car 上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
.
public class VolkswagenTest extends CarTest<Volkswagen> {
@Test(expected = UnsupportedOperationException.class)
public void testBreakdown() {
car.breakDown();
}
protected Volkswagen createCar() {
return new Volkswagen();
}
}
希望有帮助!
实际上Unit Test是指Method Test,当你要编写单元测试时,你必须考虑要编写和测试的方法的功能,然后创建用于测试的类和方法。通过在设计和编写代码时考虑这种方法,可能会创建类的层次结构或仅创建单个类或任何类型的其他设计。
但是当你必须像上面提到的那样使用现有设计时,最好的做法是使用Interfaces
或Base Classes
依赖对象,因为这样你可以轻松地模拟或存根这些类。