我正在寻找可以重用 Given & Then 进行单元和集成测试的 BDD java 框架。
换句话说 1. 给定一些先决条件。 2. 何时 - 取决于环境 3. Then验证When
的结果我希望能够通过更改 When 并保持 Given 和 Then 完整,更改测试类型,例如在简单的 REST 服务中:
- 单元测试
- 给予
- 生成一些 POJO 对象
- 何时
- 从 Given 接收 POJO
- 使用此 POJO 调用内部服务
- 从服务接收 POJO 形式的结果
- 将收到的 POJO 转发给 Then
- 然后
- 从When 验证POJO
- 给予
- 整合测试
- 给予
- 生成一些 POJO 对象
- 何时
- 从 Given 接收 POJO
- 以外部服务格式加密 POJO
- 调用外部服务
- 从暴露的服务接收外部服务格式的结果
- 在 POJO 中转换接收到的结果
- 将收到的 POJO 转发给 Then
- 然后
- 从When 验证POJO
- 给予
因此,在示例中,Given 和 Then 的行为方式相同,对于集成测试和单元测试,只需更改 When the scope of the test goes从单元到集成。
有人能指出我正确的方向吗?
我不想重新发明轮子
最佳答案
免责声明:我是 JGiven 的作者。
JGiven正是提供了这一点。它是 Java 的 BDD 框架,其中场景由所谓的阶段类构建。对于您的示例,您需要四个阶段类:GivenInput、WhenInternalService、WhenExternalService 和 ThenOutput。然后你可以写两个测试:
内部服务的单元测试:
public class InternalServiceTest extends
ScenarioTest<GivenInput, WhenInternalService, ThenOutput> {
@Test
public void internal_service_works_as_expected() {
given().some_input();
when().the_internal_service_is_called();
then().the_result_is_correct();
}
}
对外服务的集成测试:
public class ExternalServiceTest extends
ScenarioTest<GivenInput, WhenExternalService, ThenOutput> {
@Test
public void external_service_works_as_expected() {
given().some_input();
when().the_external_service_is_called();
then().the_result_is_correct();
}
}
阶段类看起来像这样:
public class GivenInput extends Stage<GivenInput> {
@ProvidedScenarioState
InputPojo input;
public GivenInput some_input() {
input = new InputPojo();
return self();
}
}
public class WhenInternalService extends Stage<WhenInternalService> {
@ExpectedScenarioState
InputPojo input;
@ProvidedScenarioState
OutputPojo output;
public WhenInternalService the_internal_service_is_called() {
output = new InternalService().invoke(input);
return self();
}
}
public class WhenExternalService extends Stage<WhenExternalService> {
@ExpectedScenarioState
InputPojo input;
@ProvidedScenarioState
OutputPojo output;
public WhenExternalService the_external_service_is_called() {
ExternalInput externalInput = transformToExternal(input);
ExternalOutput externalOutput = new ExternalService().invoke(external);
output = transformToInternal(externalOutput);
return self();
}
}
public class ThenOutput extends Stage<ThenOutput> {
@ExpectedScenarioState
OutputPojo output;
public ThenOutput the_result_is_correct() {
assertThat(output).isNotNull();
return self();
}
}
请注意,步骤方法以流畅的界面风格编写,以便能够链接多个条件(尽管在您的示例中不需要)。
关于java - 是否有能够重用 Given, Then 的 BDD java 框架? (具有不同的 When 步骤),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14827145/