在 Java 中,“组合代码”通常指通过对象组合(composition)来实现功能,而不是继承。测试组合代码的核心思想是:验证“被组合对象的行为”是否被正确调用,以及“组合对象自身逻辑”是否正确。
下面从常见测试方式 + 示例来说明。
// 被组合的类
public class Engine {
public String start() {
return "Engine started";
}
}
// 组合类
public class Car {
private Engine engine;
public Car(Engine engine) {
this.engine = engine;
}
public String run() {
return engine.start() + " -> Car running";
}
}
适合简单、无外部依赖的情况。
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class CarTest {
@Test
void testCarRunWithRealEngine() {
Engine engine = new Engine();
Car car = new Car(engine);
assertEquals(
"Engine started -> Car running",
car.run()
);
}
}
✅ 优点:简单直接
❌ 缺点:如果 Engine 很复杂或依赖外部资源,不适合
组合代码一定是通过构造函数或 setter 注入依赖,方便测试。
import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;
class CarTest {
@Test
void testCarRunWithMockEngine() {
Engine mockEngine = mock(Engine.class);
when(mockEngine.start()).thenReturn("Mock engine started");
Car car = new Car(mockEngine);
String result = car.run();
assertEquals("Mock engine started -> Car running", result);
verify(mockEngine).start(); // 验证组合对象调用了 engine
}
}
✅ 优点:
如果组合类本身有逻辑:
public class Car {
private Engine engine;
private boolean running;
public Car(Engine engine) {
this.engine = engine;
}
public void start() {
if (!running) {
engine.start();
running = true;
}
}
public boolean isRunning() {
return running;
}
}
测试:
@Test
void testStartOnlyOnce() {
Engine mockEngine = mock(Engine.class);
Car car = new Car(mockEngine);
car.start();
car.start();
verify(mockEngine, times(1)).start();
assertTrue(car.isRunning());
}
// ✅ 好
public Car(Engine engine)
// ❌ 不好
public Car() {
this.engine = new Engine();
}
如果你有具体的组合代码结构(比如 Spring Bean、策略模式、装饰器模式),我可以帮你写针对性测试用例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。