Java 程序单元测试假设开发者开发了一个销售系统的“供货折扣计算模块”,该模块的业务逻辑需要满足以下规则: 1) 当客户为批发型企业时,若订货数大于 50 件且发货距离不超过 50 公里时,折扣率为15%;若订货数大于 50 件且发货距离超过 50 公里时,折扣率为 10%。 2) 当客户为非批发型企业时,若订货数大于 100 件且发货距离不超过 50 公里时,折扣率为 10%;若订货数大于 100 件且发货距离超过 50 公里时,折扣率为 5%。 3) 其他情况没有折扣,返回 0。 1. 针对给定的待测软件单元的需求规格说明与 Java 代码,设计测试用例(可设计简单的测试用例); 2. 使用 JUnit 测试框架编写测试用例代码,并使用 JMock 工具编写待测软件单元的桩模块。
时间: 2024-03-21 08:40:45 浏览: 43
1. 针对这个需求规格说明,可以设计以下测试用例:
- 客户为批发型企业,订货数大于 50,发货距离不超过 50 公里,应该有 15% 折扣
- 客户为批发型企业,订货数大于 50,发货距离超过 50 公里,应该有 10% 折扣
- 客户为非批发型企业,订货数大于 100,发货距离不超过 50 公里,应该有 10% 折扣
- 客户为非批发型企业,订货数大于 100,发货距离超过 50 公里,应该有 5% 折扣
- 客户为批发型企业,订货数不足 50,无折扣
- 客户为非批发型企业,订货数不足 100,无折扣
- 客户为批发型企业,发货距离超过 50 公里,无折扣
- 客户为非批发型企业,发货距离超过 50 公里,无折扣
2. 使用 JUnit 测试框架和 JMock 工具,可以编写以下测试代码:
```java
import org.junit.Assert;
import org.junit.Test;
import org.jmock.Mockery;
import org.jmock.Expectations;
public class DiscountCalculatorTest {
private Mockery context = new Mockery();
@Test
public void testCalculateDiscount() {
final FreightCalculator mockFreightCalculator = context.mock(FreightCalculator.class);
// 设置桩模块,模拟计算运费的行为
context.checking(new Expectations() {{
allowing(mockFreightCalculator).calculateFreight(with(any(Order.class))));
will(returnValue(40.0));
}});
// 客户为批发型企业,订货数大于 50,发货距离不超过 50 公里,应该有 15% 折扣
double discount = DiscountCalculator.calculateDiscount(true, 60, mockFreightCalculator);
Assert.assertEquals(0.15, discount, 0.0001);
// 客户为批发型企业,订货数大于 50,发货距离超过 50 公里,应该有 10% 折扣
discount = DiscountCalculator.calculateDiscount(true, 60, mockFreightCalculator);
Assert.assertEquals(0.1, discount, 0.0001);
// 客户为非批发型企业,订货数大于 100,发货距离不超过 50 公里,应该有 10% 折扣
discount = DiscountCalculator.calculateDiscount(false, 120, mockFreightCalculator);
Assert.assertEquals(0.1, discount, 0.0001);
// 客户为非批发型企业,订货数大于 100,发货距离超过 50 公里,应该有 5% 折扣
discount = DiscountCalculator.calculateDiscount(false, 120, mockFreightCalculator);
Assert.assertEquals(0.05, discount, 0.0001);
// 客户为批发型企业,订货数不足 50,无折扣
discount = DiscountCalculator.calculateDiscount(true, 30, mockFreightCalculator);
Assert.assertEquals(0, discount, 0.0001);
// 客户为非批发型企业,订货数不足 100,无折扣
discount = DiscountCalculator.calculateDiscount(false, 80, mockFreightCalculator);
Assert.assertEquals(0, discount, 0.0001);
// 客户为批发型企业,发货距离超过 50 公里,无折扣
discount = DiscountCalculator.calculateDiscount(true, 60, mockFreightCalculator);
Assert.assertEquals(0, discount, 0.0001);
// 客户为非批发型企业,发货距离超过 50 公里,无折扣
discount = DiscountCalculator.calculateDiscount(false, 120, mockFreightCalculator);
Assert.assertEquals(0, discount, 0.0001);
// 验证桩模块的调用次数
context.assertIsSatisfied();
}
}
```
在测试代码中,我们使用 JMock 工具来模拟 FreightCalculator 类,并设置桩模块,模拟计算运费的行为。同时,我们针对不同的输入,通过 `assertEquals` 方法来验证输出结果是否符合预期。如果任意一个测试用例失败,那么测试框架会自动提示测试失败。通过编写这样的单元测试代码,开发者可以确保自己的业务逻辑代码在各种情况下都能够正确运行,并且与其他模块的协作也能够正确。