3.如何实现Mock对象?
5 k; X" K, x; y) h 使用mock对象进行测试的时候,我们总共需要3个步骤,分别是:' T4 e9 e! B$ K: I
----- 使用一个接口来描述这个对象
( s- e0 X4 s' t! c" y& b ----- 为产品代码实现这个接口
. F0 \+ F8 \0 T0 ~ ----- 以测试为目的,在mock对象中实现这个接口
$ W, A$ R% ~, N; T# P8 l 在此我们又一次看到了针对接口编程的重要性了,因为被测试的代码只会通过接口来引用对象,所以它完全可以不知道它引用的究竟是真实的对象还是mock对象,下面看一个实际的例子:一个闹钟根据时间来进行提醒服务,如果过了下午5点钟就播放音频文件提醒大家下班了,如果我们要利用真实的对象来测试的话就只能苦苦等到下午五点,然后把耳朵放在音箱旁...我们可不想这么笨,我们应该利用mock对象来进行测试,这样我们就可以模拟控制时间了,而不用苦苦等待时钟转到下午5点钟了。下面是代码:
2 k; X7 l7 J" v2 s6 g public interface Environmental {
3 g; w7 R' d! ~- D$ F private boolean playedWav = false;
. j) F7 X9 j- @ public long getTime();
& U4 ?6 i' w: t, g public void playWavFile(String fileName);
; u( `: E6 |' D: U1 q( X public boolean wavWasPlayed();
# y9 t1 b9 O9 D6 ] public void resetWav();8 I1 w: b! N; E; Y# _* b
}
# j+ W- j) A6 s' ?5 I 真实的实现代码:
" y& }1 m2 F, [- g" U7 C public class SystemEnvironment implements Environmental {
4 K- H9 q. {( p! k+ Y% g" f# n" ? public long getTime() {
, V+ _0 |3 X7 S2 \( A return System.currentTimeMillis();* s( H0 T& i& T
}, z! B1 u* W' G& S8 ?
public void playWavFile(String fileName) {
% C9 m: d$ ]" } R7 F; ~8 T playedWav = true;( m0 B# n# D# v& ]+ S& Q7 b( w4 d. W! y
}
" {3 | c5 Z$ j" j" X Q7 [1 Z public boolean wavWasPlayed() {) A6 H: }+ P+ _' L
return playedWav;
7 Y+ l6 E* |9 j. B' ]6 I }
3 H; o8 O4 c- [ public void resetWav() {
- H* m# m" H7 D; j playedWav = false;7 V7 t: j) J( j, G3 P9 W8 X+ y3 W
}
X9 A. R: J( X) l4 h8 S7 e6 J }
2 J0 L; \ J5 x4 q! R/ \8 s2 F 下面是mock对象:: b' t% g2 k2 b; l( T6 Y9 `
public class MockSystemEnvironment implements Environmental {$ T0 P' X% T% `' h! _
private long currentTime;* N0 P1 e* R# C3 L8 H j
public long getTime() {) E# h$ [2 `/ @# B: T
return currentTime;
; z+ [2 ~, w1 b, o4 }) @& q5 | }
- w* W F+ r- C: f4 f1 N& A public void setTime(long currentTime) {
, b* F. @6 S3 v# J# i3 p this.currentTime = currentTime;
* D' u6 W8 O0 j, `( X( O3 s/ ` }4 A: Q! L1 ]3 S* @' U; p
public void playWavFile(String fileName) {& f8 }& k: T* W6 a8 l9 k; i! }6 h' h
playedWav = true;
* d5 M! O9 a D2 f7 _! j }
: f* e; P( v+ X% K* n2 f6 L public boolean wavWasPlayed() {
* q# O, d+ q" Z* v; I return playedWav;" E, s% d2 ]# y8 z9 _4 q
}
, {. G( P( x2 r4 [1 D8 D7 R public void resetWav() {0 a3 l. G, e5 {
playedWav = false;
# k, I5 n" E6 B' x }
9 E9 f4 F& B7 l }
# t, \* V; y2 w2 X( Q/ {( Y! g, p 下面是一个调用getTime的具体类:' |; C0 s3 X7 X6 R, W0 ?
import java.util.Calendar;3 e" C+ ]9 a3 r6 ?$ I# I
public class Checker {
) }9 X1 z2 E( @2 q, x/ L private Environmental env;
! @) g0 H; e0 Z$ }" D' C public Checker(Environmental env) {
- S4 q0 {. t) ?& c9 l7 K5 T7 h4 } this.env = env; |