Mocking Instance Methods In Java 上課筆記

上課的筆記:Advanced JUnit testing with PowerMock and PowerMockito

這裡會讓你知道有無使用 Mocking Framework 寫法上的差異。

Without PowerMockito

一般來說,如果沒有使用任何的 Mocking Framework,那麼就會需要使用 繼承 的方式來做到 mock 物件的這件事情。

以下範例是沒有使用 Mocking Framework

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Test
public void StartCart_Should_Ok_When_Engine_Ok() {
EngineMock engine = new EngineMock();
engine.setReturnValue(Engine.STARTED_OK);
Car car = new Car(engine);
assertTrue(car.start());
}

class EngineMock extends Engine {
private int code;

public void setReturnValue(int value) {
code = value;
}

@Override
public int start() {
return code;
}
}

用物件導向的優點:繼承,將方法用複寫的方式,在測試端做一個 Stub 並繼承 Production Code 的 Class 並複寫該方法,用 DI 的概念將相依的物件(例如: Engine)注入到假的 Class。

Using PowerMockito

使用 PowerMockito 來改寫上面範例並不用繼承的方式。

1
2
3
4
5
6
7
8
9
10
@Test
public void StartCar_Should_Ok_When_Engine_Ok_UsingPowerMock() {
Engine engine = PowerMockito.mock(Engine.class);
PowerMockito.when(engine.start()).thenReturn(Engine.STARTED_OK);
Car car = new Car(engine);

boolean actual = car.start();

assertTrue(actual);
}

這樣是不是精簡許多!!!