你的设计很常见(理所当然),所以我对这个问题不断出现感到有点惊讶。
您需要进行两种类型的测试:
-
集成测试- 确保从 API 调用开始到操作层完成其工作结束的流程正常工作
-
单元测试- 测试 API 层以及操作层的每个类
集成测试是非常不言自明的(如果没有,请告诉我,我会详细说明),所以我猜测您指的是单元测试。两个不同的层需要进行不同的测试。
运营层:
在这里,您尝试检查执行实际工作的类是否正在工作。这意味着您应该实例化您正在测试的类,为其提供输入,并检查它提供的输出是否符合您的期望。
假设你有一个这样的类:
public class OperationA {
public int multiply(int x, int y) {
return x * y;
}
}
检查它是否符合您的预期意味着编写一个测试,例如(测试用例本身只是一个示例,不要太认真):
public class OperationATest {
@Test
public void testMultiplyZeroByAnyNumberResultsInZero() {
OperationA op = new OperationA();
assertEquals(0, op.multiply(0, 0));
assertEquals(0, op.multiply(10, 0));
assertEquals(0, op.multiply(-10, 0));
...
}
@Test
public void testMultiplyNegativeByNegativeResultsInPositive() {
...
}
...
}
API层:
在这里,您尝试检查这些类是否使用操作层中的正确类、以正确的顺序执行正确的操作。为了做到这一点,您应该使用模拟,并使用verify
模拟的操作。
假设你有一个这样的类:
public class API_A {
private OperationA op;
public API_A(OperationA op) {
this.op = op;
}
public int multiplyTwice(int a, int b, int c) {
int x = op.multiply(a, b);
int y = op.multiply(x, c);
return y;
}
}
检查它是否符合您的预期意味着(使用 Mockito 语法)编写一个测试,例如:
public class API_A_Test {
@Test
public void testMultiplyTwiceMultipliesTheFirstNumberByTheSecondAndThenByTheThird() {
OperationA op = mock(OperationA.class);
when(op.multiply(12, -5)).thenReturn(60);
API_A api = new API_A(op);
api.multiply(12, -5, 0);
verify(op).multiply(12, -5);
verify(op).multiply(-60, 0);
}
}