JMockit學習之mock介面和抽象類
大型軟體專案,往往會在設計的時候進行模組化劃分,模組之間存在依賴關係。為了減少各個模組之間的耦合,通過介面進行依賴,各個模組由不同的開發組進行並行開發。如果A模組需要使用B模組的介面,但是B模組由於開發進度緩慢,並沒有完成對應實現類的開發。那麼這個時候A進行單元測試就有困難了。如果A需要測試自己的模組功能,就需要將B的介面進行mock。下面介紹下jmockit如何mock介面的。
package code.c1;
public interface IStudentService {
public String getName(int id);
public int getAge(int id);
}
package code.c1;
public abstract class AbstractStudentService {
public String getName(int id) {
return "ATY";
}
public abstract int getAge(int id);
}
下面是單元測試:
package net.aty.testtools.jmockit.c1;
import mockit.Mock;
import mockit.MockUp;
import org.junit.Assert;
import org.junit.Test;
import code.c1.AbstractStudentService;
import code.c1.IStudentService;
public class Run {
@Test
public void t1() {
MockUp<IStudentService> proxyStub = new MockUp<IStudentService>() {
// 需要使用@Mock標記,否則jmockit不會處理;
// 而且方法的簽名必須與介面中方法簽名一致,否則jmockit會報錯
@Mock
public String getName(int id) {
return "00" + id;
}
};
IStudentService mockInstance = proxyStub.getMockInstance();
Assert.assertEquals("001", mockInstance.getName(1));
Assert.assertEquals(0, mockInstance.getAge(1));
proxyStub.tearDown();
}
@Test
public void t2() {
MockUp<AbstractStudentService> proxyStub = new MockUp<AbstractStudentService>() {
@Mock
public int getAge(int id) {
return 10 * id;
}
};
AbstractStudentService mockInstance = proxyStub.getMockInstance();
Assert.assertEquals("ATY", mockInstance.getName(1));
Assert.assertEquals(10, mockInstance.getAge(1));
proxyStub.tearDown();
}
}
jmockit有如下特點:
1、如果目標介面中存在多個方法,我們只需要關注需要自己mock的方法即可,對於不需要的方法,jmockit會提法預設實現,不用我們去實現介面中的所有方法。
2、MockUp中mock的方法一定要與對應介面中方法簽名一致,否則會報錯java.lang.IllegalArgumentException: Matching real methods not found for the following mocks。
3、MockUp中的方法一定要加@Mock註解,否則會被jmockit忽略,不能達到mock的目的。
我使用的jmockit版本如下:
<dependency>
<groupId>org.jmockit</groupId>
<artifactId>jmockit</artifactId>
<version>1.22</version>
</dependency>
相關文章
- Java學習筆記之介面和抽象類Java筆記抽象
- JavaSE基礎知識學習—–抽象類和介面Java抽象
- JavaSE基礎知識學習-----抽象類和介面Java抽象
- 介面和抽象類抽象
- 抽象類和介面抽象
- Java 基礎學習總結(一)抽象類和介面Java抽象
- 介面和抽象類 (abstract)抽象
- java中抽象類和介面Java抽象
- 介面和抽象類詳解抽象
- 有關“抽象類”和“介面”的異同之處?抽象
- 介面的行為抽象和抽象類的行為抽象抽象
- Java基礎-抽象類和介面Java抽象
- 抽象類和介面的區別抽象
- 介面和抽象類的區別抽象
- Java抽象類和介面 小白版Java抽象
- 介面(抽象類)與後期靜態繫結學習抽象
- 介面、抽象類、普通類之間的關係抽象
- 抽象類和介面,你瞭解多少?抽象
- Java抽象(方法,類)和Java的介面Java抽象
- 抽象類與介面抽象
- 抽象類VS介面抽象
- 介面與抽象類抽象
- Python 學習筆記之類「物件導向,超類,抽象」Python筆記物件抽象
- 抽象類和介面的相同點和不同點抽象
- 大資料學習:抽象類大資料抽象
- java介面和抽象類的簡單理解Java抽象
- 關於抽象類和介面的初步理解抽象
- Java中抽象類和介面的區別Java抽象
- JAVA中介面和抽象類的區別Java抽象
- PHP物件和介面抽象類注意事項PHP物件抽象
- 我如何理解Java中抽象類和介面Java抽象
- 深入理解Java的介面和抽象類Java抽象
- C# OOP:繼承,介面和抽象類C#OOP繼承抽象
- JAVA基礎之三-介面和抽象類Java抽象
- Java的抽象類 & 介面Java抽象
- 抽象類 & 介面比較抽象
- Java之繼承和抽象類Java繼承抽象
- Python學習之路30-介面:從協議到抽象基類Python協議抽象