【发布时间】:2020-06-20 18:26:31
【问题描述】:
我正在参加以下测试课程。我想知道是否有一种设计模式可以减少以下场景中的代码重复。
public abstract class BaseTestClass {
protected String color;
protected String type;
protected Product product;
abstract void setColor();
abstract void setClothType();
abstract Product createTheProduct();
@BeforeClass
public void setUp(){
// there're partial overlaps of "setup" for pants and shirts
}
@Test
public void doATest(){
testSomethingWithProduct(product);
}
@AfterClass
public void tearDown(){
// there're partial overlaps of "tearDown" for pants and shirts
}
}
public class TestBlueShirt extends BaseTestClass {
@Override
void setColor() {
this.color = "blue";
}
@Override
void setClothType() {
this.type = "shirt";
}
@Override
Product createTheProduct() {
setColor();
setClothType();
// create this.product based on color and type...
}
}
public class TestRedShirt extends BaseTestClass {}
public class TestBluePants extends BaseTestClass {}
public class TestRedPants extends BaseTestClass {}
...
在为同一种布料设置颜色或为同一种颜色设置类型时,您会发现代码重复。我想知道我怎样才能有一个具体的类可以产生类似Class<T>(RedShirt、BlueShirt、RedPants 等)的东西,并且基于Class<T>,我可以直接在基类中实现@Test。所以我可以尽量避免代码重复。
类似:
public abstract class BaseTestClass {
protected Product product;
abstract Product createTheProduct(Class<T> ...);
@BeforeClass
public void setUp(){
setUpBasedOnProduct(Class<T> ...);
}
@Test
public void doATest(){
testSomethingWithProduct(product);
}
@AfterClass
public void tearDown(){
tearDownBasedOnProduct(Class<T> ...);
}
}
import ...ClassGenerator
public class TestBlueShirt extends BaseTestClass {
@Override
createTheProduct(ClassGenerator.createClass("blue", "shirt"));
}
提前致谢!
【问题讨论】:
-
ParameterizedTests 可以成为您的解决方案吗? baeldung.com/parameterized-tests-junit-5
-
@AminM 谢谢!但我正在做一个集成测试。所以我认为这不会奏效......
标签: java design-patterns