これは、私が以前に使用したアプローチの 1 つです (まあ、これの変形です)。
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();
}
}
それが役立つことを願っています!