Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
ÓÐЧʹÓÃMock±àдjavaµ¥Ôª²âÊÔ
 
  3946  次浏览      27
 2019-8-13
 
±à¼­ÍƼö:
±¾ÎÄÀ´×Ôcnblogs£¬±¾Îļòµ¥½éÉÜÈçºÎʹÓÃEasyMock£¬PowerMockµÈÀ´½øÐе¥Ôª²âÊÔ£¬Ï£ÍûÄܶÔÄúÓÐËù°ïÖú¡£

Javaµ¥Ôª²âÊÔ¶ÔÓÚ¿ª·¢ÈËÔ±ÖÊÁ¿±£Ö¤ÖÁ¹ØÖØÒª£¬ÓÈÆäµ±Ãæ¶ÔÒ»ÍÅÂÒÂëµÄÒÅÁô´úÂëʱ£¬Ã»Óи߸²¸ÇÂʵĵ¥Ôª²âÊÔ×ö±£ÕÏ£¬Ã»È˸ÒÇáÒ×¶Ô´úÂë½øÐÐÖØ¹¹¡£È»¶øµ¥Ôª²âÊԵıàдҲ²»ÊÇÒ»¼þÈÝÒ×µÄÊÂÇ飬³ý·ÇʹÓÃTDD·½Ê½£¬·ñÔò±àд³öÈÝÒײâÊԵĴúÂë²»µ«¶Ô¿ª·¢ÈËÔ±µÄÉè¼Æ±àÂëÒªÇóºÜ¸ß£¬¶øÇÒ´úÂëÖеĸ÷ÖÖÒÀÀµÒ²³£³£Îªµ¥Ôª²âÊÔ´øÀ´ÎÞÇîÎÞ¾¡µÄÕϰ­¡£

ÁîÈËÐÀοµÄÊÇ¿ªÔ´ÉçÇø¸÷ÖÖÓÅÐãµÄMock¿ò¼ÜÈõ¥Ôª²âÊÔ²»ÔÙ¸´ÔÓ£¬±¾Îļòµ¥½éÉÜEasyMock£¬PowerMockµÈµÄ»ù±¾³£ÓÃÓ÷¨¡£

Mock˵°×Á˾ÍÊÇ´ò×®£¨Stub£©»òÔòÄ£Ä⣬µ±Äãµ÷ÓÃÒ»¸ö²»ºÃÔÚ²âÊÔÖд´½¨µÄ¶ÔÏóʱ£¬Mock¿ò¼ÜΪÄãÄ£ÄâÒ»¸öºÍÕæÊµ¶ÔÏóÀàËÆµÄÌæÉíÀ´Íê³ÉÏàÓ¦µÄÐÐΪ¡£

EasyMock£º

ʹÓÃÈçÏ·½Ê½ÔÚMavenÖÐÌí¼ÓEasyMockµÄÒÀÀµ£º

<dependency>
<groupId>org.easymock</groupId>
<artifactId>easymock</artifactId>
<version>3.2</version>
<scope>test</scope>
</dependency>

EasyMockʹÓö¯Ì¬´úÀíʵÏÖÄ£Äâ¶ÔÏó´´½¨£¬Æä»ù±¾²½ÖèΪÒÔÏÂËIJ½£º

ÒÔÊý¾Ý¿âÓ¦ÓÃΪÀýµÄ±»²âÊÔ´úÂëÈçÏ£º

public class UserServiceImpl{
private UserDao dao;
public User query(String id) throws Exception{
try{
return dao.getById(id);
}catch(Exception e){
throw e;
}
return null;
}
}

public class UserDao{
public User getById(String id) throws Exception{
try{
return ¡­¡­;
}catch(Exception e){
throw e;
}
return null;
}
}

ÏÖÔÚÏ£Íû¶ÔUserServiceImpl½øÐвâÊÔ£¬¶øUserDao¿ª·¢×éÖ»¸ø³ö½Ó¿Ú£¬ÉÐδÍê³É¹¦ÄÜʵÏÖ¡£

ʹÓÃMock¶ÔUserDao½øÐÐÄ£ÄâÀ´²âÊÔUserServiceImpl¡£

(1).»ù±¾µÄ²âÊÔ´úÂëÈçÏ£º

public class UserServiceImplTest {
@Test
public void testQuery() {
User expectedUser = new User();
user.setId(¡°1001¡±);
UserDao mock = EasyMock.createMock(UserDao.class); //´´½¨Mock¶ÔÏó
Easymock.expect(mock.getById("1001")) .andReturn(expectedUser);//Â¼ÖÆMock¶ÔÏóÔ¤ÆÚÐÐΪ
Easymock.replay(mock); //ÖØ·ÅMock¶ÔÏ󣬲âÊÔʱÒÔÂ¼ÖÆµÄ¶ÔÏóÔ¤ÆÚÐÐΪ´úÌæÕæÊµ¶ÔÏóµÄÐÐΪ

UserServiceImpl service = new UserServiceImpl();
service.setUserDao(mock);
user user = service.query("1001");//µ÷ÓòâÊÔ·½·¨
assertEquals(expectedUser, user); //¶ÏÑÔ²âÊÔ½á¹û
Easymock.verify(mock);//ÑéÖ¤Mock¶ÔÏó±»µ÷ÓÃ
}
}

×¢Ò⣺

ÔÚEasyMock3.0֮ǰ£¬org.easymock.EasyMockʹÓÃJDKµÄ¶¯Ì¬´úÀíʵÏÖMock¶ÔÏó´´½¨£¬Òò´ËÖ»ÄÜÕë¶Ô½Ó¿Ú½øÐÐMock£¬org.easymock.classextension.EasyMockʹÓÃCGLIB¶¯Ì¬´úÀí´´½¨Mock¶ÔÏ󣬿ÉÒÔÕë¶ÔÆÕͨÀà½øÐÐMock¡£

ÔÚEasyMock3.0Ö®ºó£¬org.easymock.classextension.EasyMock±»·ÏÆú£¬Ê¹ÓÃorg.easymock.EasyMock¿ÉÒÔÕë¶Ô½Ó¿ÚºÍÆÕͨÀà½øÐÐMock¶ÔÏó´´½¨¡£

(2).µ÷ÓòâÊÔÉ趨£º

Èç¹ûÏë²âÊÔUserServiceImplµ÷ÓÃÁËUserDaoµÄgetById·½·¨3´Î£¬ÔòʹÓÃÈçÏ´úÂë¼´¿É£º

Easymock.expect(mock.getById("1001")) .andReturn(exceptUser).times(3);

(3).·½·¨Òì³££º

Èç¹ûÏë²âÊÔUserServiceImplÔÚµ÷ÓÃUserDaoµÄgetById·½·¨Ê±·¢ÉúÒì³££¬¿ÉÒÔʹÓÃÈçÏ´úÂ룺

Easymock.expect(mock.getById("1001")) .andThrow(new RuntimeException());

ÔÚ²âÊÔUserServiceImplʱ¾Í¿ÉÒÔʹÓÃtry-catch²¶»ñMockµÄÒì³£¡£

(4).»ù±¾²ÎÊýÆ¥Å䣺

ÉÏÃæµÄ·½·¨ÔÚMock UserDaoµÄgetById·½·¨Ê±´«ÈëÁË¡°0001¡±µÄÔ¤ÆÚÖµ£¬ÕâÖÖ·½Ê½ÊǾ«È·²ÎÊýÆ¥Å䣬Èç¹ûUserServiceImplÔÚµ÷ÓÃÊÇ´«ÈëµÄ²ÎÊý²»ÊÇ¡°0001¡±¾Í»á·¢ÉúUnexpect methodµÄMockÒì³££¬¿ÉÒÔʹÓÃÏÂÃæµÄ·½·¨ÔÚMockʱ½øÐвÎÊýÆ¥Å䣺

Easymock.expect(mock.getById (Easymock.isA(String.class))) .andReturn(exceptedUser).times(3);

isA()·½·¨»áʹÓÃinstanceof½øÐвÎÊýÀàÐÍÆ¥Å䣬ÀàËÆµÄ·½·¨»¹ÓÐanyInt()£¬anyObject()£¬ isNull()£¬same(), startsWith()......

(5).Êý×éÀàÐͲÎÊýÆ¥Å䣺

Èç¹ûUserServiceImplÔÚµ÷ÓÃUserDaoµÄ·½·¨Ê±´«ÈëµÄ²ÎÊýÊÇÊý×飬´úÂëÈçÏ£º

public class UserServiceImpl{
private UserDao dao;
public List<String> queryNames(String[] ids) throws Exception{
try{
return dao.getNames(ids);
}catch(Exception e){
throw e;
}
return null;
}
}

public class UserDao{
public List<String> getNames(String[] ids) throws Exception{
try{
return ¡­¡­;
}catch(Exception e){
throw e;
}
return null;
}
}

´ËʱÓÐÁ½ÖÖ°ì·¨À´½øÐвÎÊýÆ¥Å䣺

a.Êý×鱨ÐëºÍ²âÊÔ¸ø¶¨µÄÒ»Ö£º

Easymock.expect(mock.getNames (EasyMock.aryEq(testIds))) .andReturn(exceptedNames);

b.²»¿¼ÂDzâÊÔÊý×éÄÚÈÝ£º

Easymock.expect(mock.getNames (EasyMock.isA(String[].class))) .andReturn(exceptedNames);

(6).void·½·¨Mock£º

Èç¹ûÒªMockµÄ·½·¨ÊÇÎÞ·µ»ØÖµÀàÐÍ£¬Àý×ÓÈçÏ£º

public class UserDao {
public void updateUserById(String id) throws Exception{
try{
update¡­
}catch(Exception e){
throw e;
}
}
}

a.Õý³£Mock´úÂëÈçÏ£º

mock.updateUserById(¡°TestId¡±);
EasyMock.expectLastCall().anytimes();

b.Ä£Äâ·¢ÉúÒì³£µÄMock´úÂëÈçÏ£º

mock.updateUserById(¡°TestId¡±);
EasyMock.expectLastCall().andThrow(new RuntimeException()).anytimes();

(7).¶à´Îµ÷Ó÷µ»Ø²»Í¬ÖµµÄMock£º

¶ÔÓÚµü´úÆ÷ÀàÐ͵ıéÀú´úÂëÀ´Ëµ£¬ÐèÒªÔÚ²»Í¬µ÷ÓÃʱ¼ä·µ»Ø²»Í¬µÄ½á¹û£¬ÒÔJDBC½á¹û¼¯ÎªÀý´úÂëÈçÏ£º

public List<String> getUserNames () throws Exception{
List<String> usernames = new ArrayList<String>();
ResultSet rs = pstmt.executeQuery(query);
try {
while(rs.next()){
usernames.add(rs.getString(2));
}
} catch (SQLException e) {
throw e;
}
}

ÔÚMock½á¹û¼¯µÄnext·½·¨Ê±Èç¹û×Ü·µ»Øtrue£¬Ôò´úÂë¾Í»áÏÝÈëËÀÑ­»·£¬Èç¹û×Ü·µ»ØfalseÔò´úÂëÂß¼­¸ù±¾ÎÞ·¨Ö´Ðе½Ñ­»·ÌåÄÚ¡£

Õý³£µÄ²âÊÔÂß¼­Ó¦¸ÃÊÇÏÈ·µ»Ø¼¸´ÎtrueÖ´ÐÐÑ­»·Ì壬ȻºóÔÚ·µ»ØfalseÍ˳öÑ­»·£¬Ê¹ÓÃMock¿ÉÒÔ·½±ãÄ£ÄâÕâÖÖÔ¤ÆÚµÄÐÐΪ£¬´úÂëÈçÏ£º

EasyMock.expect(rs.next()).andReturn(true).times(2) .andReturn(false).times(1);

¸ü¶àµÄ¹ØÓÚEasyMockµÄÓ÷¨£¬Çë²Î¿¼EasyMock¹Ù·½Îĵµ£º

http://easymock.org/ EasyMock3_0_Documentation.html¡£

PowerMock£º

ÉÏÃæ½éÉܵÄEasyMock¿ÉÒÔÂú×ãµ¥Ôª²âÊÔÖеĴ󲿷ÖÐèÇ󣬵«ÊÇÓÉÓÚ¶¯Ì¬´úÀíÊÇʹÓÃÁËÃæÏò¶ÔÏóµÄ¼Ì³ÐºÍ¶àÌ¬ÌØÐÔ£¬JDK×ÔÉíµÄ¶¯Ì¬´úÀíÖ»Õë¶Ô½Ó¿Ú½øÐдúÀí£¬Æä±¾ÖÊÊÇΪ½Ó¿ÚÉú³ÉÒ»¸öʵÏÖÀ࣬¶øCGLIB¿ÉÒÔÕë¶ÔÀà½øÐдúÀí£¬Æä±¾ÖÊÊǽ«Àà×ÔÉí×÷Ϊ»ùÀà¡£

Èç¹ûÓöµ½Á˾²Ì¬¡¢finalÀàÐ͵ÄÀàºÍ·½·¨£¬ÒÔ¼°Ë½Óз½·¨£¬EasyMockµÄ¶¯Ì¬´úÀí¾ÖÏÞÐÔʹµÃÎÞ·¨²âÊÔÕâÐ©ÌØÐÔÇé¿ö¡£

PowerMockÊÇÔÚEasyMock»ù´¡ÉϽøÐÐÀ©Õ¹£¨Ö»ÊDz¹³ä£¬²»ÊÇÌæ´ú£©£¬Ê¹ÓÃÁË×Ö½ÚÂë²Ù×÷¼¼ÊõÖ±½Ó¶ÔÉú³ÉµÄ×Ö½ÚÂëÀàÎļþ½øÐÐÐ޸쬴Ӷø¿ÉÒÔ·½±ã¶Ô¾²Ì¬£¬finalÀàÐ͵ÄÀàºÍ·½·¨½øÐÐMock£¬»¹¿ÉÒÔ¶Ô˽Óз½·¨½øÐÐMock£¬¸ü¿ÉÒÔ¶ÔÀà½øÐв¿·ÖMock¡£

PowerMockµÄ¹¤×÷¹ý³ÌºÍEasyMockÀàËÆ£¬²»Í¬Ö®´¦ÔÚÓÚÐèÒªÔÚÀà²ã´ÎÉùÃ÷@RunWith(PowerMockRunner.class)×¢½â£¬ÒÔÈ·±£Ê¹ÓÃPowerMock¿ò¼ÜÒýÇæÖ´Ðе¥Ôª²âÊÔ¡£

ͨ¹ýÈçÏ·½Ê½ÔÚmavenÌí¼ÓPowerMockÏà¹ØÒÀÀµ£º

<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-easymock</artifactId>
<version>1.5.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>1.5.1</version>
<scope>test</scope>
</dependency>

Àý×ÓÈçÏ£º

(1).Miock finalÀàµÄ¾²Ì¬·½·¨£º

Èç¹û²âÊÔ´úÂëÖÐʹÓõ½ÁËjava.lang.SystemÀ࣬´úÂëÈçÏ£º

public class SystemPropertyMockDemo {
public String getSystemProperty() throws IOException {
return System.getProperty("property");
}
}

Èç¹û¶ÔSystem.getProperty()·½·¨½øÐÐMock£¬´úÂëÈçÏ£º

@RunWith(PowerMockRunner.class)
@PrepareForTest({SystemPropertyMockDemo.class}) //ÉùÃ÷ÒªMockµÄÀà
public class SystemPropertyMockDemoTest {
@Test
public void demoOfFinalSystemClassMocking() throws Exception {
PowerMock.mockStatic(System.class); //Mock¾²Ì¬·½·¨
EasyMock.expect(System.getProperty("property")) .andReturn("my property");//Â¼ÖÆMock¶ÔÏóµÄ¾²Ì¬·½·¨
PowerMock.replayAll();//ÖØ·ÅMock¶ÔÏó
Assert.assertEquals("my property",
new SystemPropertyMockDemo().getSystemProperty());
PowerMock.verifyAll();//ÑéÖ¤Mock¶ÔÏó
}
}

·ÇfinalÀàµÄ¾²Ì¬·½·¨´úÂëÏàͬ£¬×¢Ò⣨ÉÏÊö´úÂëÖ»ÄÜÔÚEasyMock3.0Ö®ºó°æ±¾Õý³£ÔËÐУ©

Èç¹ûÒªÔÚEasyMock3.0֮ǰ°æ±¾Õý³£Mock finalÀàµÄ¾²Ì¬·½·¨£¬ÐèҪʹÓÃPowerMockito£¬

ͨ¹ýÈçÏ·½Ê½ÔÚmavenÖÐÌí¼ÓPowerMockitoÏà¹ØÒÀÀµ£º

<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>1.5.1</version>
<scope>test</scope>
</dependency>

´úÂëÈçÏ£º

@RunWith(PowerMockRunner.class)
@PrepareForTest({SystemPropertyMockDemo.class})
public class SystemPropertyMockDemoTest {
@Test
public void demoOfFinalSystemClassMocking() throws Exception {
PowerMockito.mockStatic(System.class);
PowerMockito.when(System.getProperty("property")) .thenReturn("my property");
PowerMock.replayAll();
Assert.assertEquals("my property",
new SystemPropertyMockDemo().getSystemProperty());
PowerMock.verifyAll();
}
}

×¢Ò⣺

¶ÔÓÚJDKµÄÀàÈç¹ûÒª½øÐо²Ì¬»òfinal·½·¨Mockʱ£¬@PrepareForTest()×¢½âÖÐÖ»Äܷű»²âÊÔµÄÀ࣬¶ø·ÇJDKµÄÀ࣬ÈçÉÏÃæÀý×ÓÖеÄSystemPropertyMockDemo.class¡£

¶ÔÓÚ·ÇJDKµÄÀàÈç¹ûÐèÒª½øÐо²Ì¬»îfinal·½·¨Mockʱ£¬ @PrepareForTest()×¢½âÖÐÖ±½Ó·Å·½·¨ËùÔÚµÄÀ࣬ÈôÉÏÃæÀý×ÓÖеÄSystem²»ÊÇJDKµÄÀ࣬Ôò¿ÉÒÔÖ±½Ó·ÅSystem.class¡£

@PrepareForTest({......}) ×¢½â¼È¿ÉÒÔ¼ÓÔÚÀà²ã´ÎÉÏ(¶ÔÕû¸ö²âÊÔÎļþÓÐЧ)£¬Ò²¿ÉÒÔ¼ÓÔÚ²âÊÔ·½·¨ÉÏ(Ö»¶Ô²âÊÔ·½·¨ÓÐЧ)¡£

(2).Mock·Ç¾²Ì¬µÄfinal·½·¨£º

±»²âÊÔ´úÂëÈçÏ£º

public class ClassDependency {
public final boolean isAlive() {
return false;
}
}

public class ClassUnderTest{
public boolean callFinalMethod(ClassDependency refer) {
return refer.isAlive();
}
}

ʹÓÃPowerMockµÄ²âÊÔ´úÂëÈçÏ£º

@RunWith(PowerMockRunner.class)
public class FinalMethodMockDemoTest {
@Test
@PrepareForTest(ClassDependency.class)
public void testCallFinalMethod() {
ClassDependency depencency = PowerMock.createMock(ClassDependency.class); //´´½¨Mock¶ÔÏó
ClassUnderTest underTest = new ClassUnderTest();
EasyMock.expect(depencency.isAlive()) .andReturn(true);
PowerMock.replayAll();
Assert.assertTrue(underTest .callFinalMethod(depencency));
PowerMock.verifyAll();
}
}

(3)²¿·ÖMockºÍ˽Óз½·¨Mock£º

Èç¹û±»²âÊÔÀàij¸ö·½·¨²»Ì«ÈÝÒ×µ÷Ó㬿ÉÒÔ¿¼ÂÇÖ»¶Ô¸Ã·½·¨½øÐÐMock£¬¶øÆäËû·½·¨È«²¿Ê¹Óñ»²âÊÔ¶ÔÏóµÄÕæÊµ·½·¨£¬¿ÉÒÔ¿¼ÂÇʹÓÃPowerMockµÄ²¿·ÖMock£¬±»²âÊÔ´úÂëÈçÏ£º

public class DataService {
public boolean replaceData(final String dataId, final byte[] binaryData) {
return modifyData(dataId, binaryData);
}
public boolean deleteData(final String dataId) {
return modifyData(dataId, null);
}

private boolean modifyData(final String dataId, final byte[] binaryData) {
return true;
}
}

Ö»¶ÔmodifyData·½·¨½øÐÐMock£¬¶øÆäËû·½·¨µ÷ÓÃÕæÊµ·½·¨£¬²âÊÔ´úÂëÈçÏ£º

@RunWith(PowerMockRunner.class)
@PrepareForTest(DataService.class)
public class DataServiceTest {
@Test
public void testReplaceData() throws Exception {
DataService tested = PowerMock.createPartialMock(DataService.class, ¡°modifyData¡±);//´´½¨²¿·Ömock¶ÔÏó£¬Ö»¶ÔmodifyData·½·¨Mock
PowerMock.expectPrivate(tested, ¡°modifyData¡±, ¡°id¡±, null).andReturn(true);//Â¼ÖÆË½Óз½·¨
PowerMock.replay(tested);
assertTrue(tested.deleteData(¡°id¡±));
PowerMock.verify(tested);
}
}

²¿·ÖMockÔÚ±»²âÊÔ·½·¨µÄÒÀÀµÔÚͬһ¸öÀ࣬ÇÒ²»ÈÝÒ×´´½¨Ê±±È½ÏÓÐÓá£

¸öÈËÈÏΪ˽Óз½·¨µÄMockÒâÒå²»ÊǺܴó£¬ÍêÈ«¿ÉÒÔʹÓ÷´Éä»úÖÆÖ±½Óµ÷Óá£

(4).µ÷ÓöÔÏóµÄ¹¹Ôì·½·¨Mock¶ÔÏó£º

ÔÚ±»²âÊÔ·½·¨ÄÚ²¿µ÷Óù¹Ôì´´½¨ÁËÒ»¸ö¶ÔÏóºÜ³£¼û£¬±»²âÊÔ´úÂëÈçÏ£º

public class PersistenceManager {
public boolean createDirectoryStructure(String directoryPath) {
File directory = new File(directoryPath);
if (directory.exists()) {
throw new IllegalArgumentException("\"" + directoryPath + "\" already exists.");
}
return directory.mkdirs();
}
}

 

´´½¨Îļþ²Ù×÷(new File(path))ÒÀÀµÓë²Ù×÷ϵͳµ×²ãʵÏÖ£¬Èç¹û¸ø¶¨µÄ·¾¶²»ºÏ·¨£¬½«»á³öÏÖÒì³£µ¼Ö²âÊÔÎÞ·¨Õý³£¸²¸Ç£¬´ËʱÐèҪʹÓÃPowerMockµÄÌṩµÄµ÷Óù¹Ôì·½·¨´´½¨Mock¶ÔÏ󣬲âÊÔ´úÂëÈçÏ£º

@RunWith(PowerMockRunner.class)
@PrepareForTest( PersistenceManager.class )
public class PersistenceManagerTest {
@Test
public void testCreateDirectoryStructure_ok() throws Exception {
File fileMock = PowerMock.createMock(File.class);
PersistenceManager tested = new PersistenceManager();
PowerMock.expectNew(File.class, "directoryPath").andReturn(fileMock);
EasyMock.expect(fileMock.exists()).andReturn(false);
EasyMock.expect(fileMock.mkdirs()).andReturn(true);
PowerMock.replay(fileMock, File.class);
assertTrue(tested.createDirectoryStructure ("directoryPath"));
PowerMock.verify(fileMock, File.class);
}
}

Ò²¿ÉÒÔʹÓøü¼ò±ãµÄ·½·¨£º

FilefileMock = PowerMock.createMockAndExpectNew (File.class,¡°directoryPath¡±);

 

ͨ¹ýEasyMock+PowerMock£¬¿ª·¢Öоø´ó²¿·ÖµÄ·½·¨¶¼¿ÉÒÔ±»²âÊÔÍêÈ«¸²¸Ç¡£

¸ü¶à¹ØÓÚPowerMockµÄÓ÷¨ºÍ²Î¿¼ÎĵµÇë²Î¿¼PowerMock¹Ù·½ÍøÖ·£º

https://code.google.com/p/powermock/¡£

 
   
3946 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

΢·þÎñ²âÊÔÖ®µ¥Ôª²âÊÔ
һƪͼÎÄ´øÄãÁ˽â°×ºÐ²âÊÔÓÃÀýÉè¼Æ·½·¨
È«ÃæµÄÖÊÁ¿±£ÕÏÌåϵ֮»Ø¹é²âÊÔ²ßÂÔ
È˹¤ÖÇÄÜ×Ô¶¯»¯²âÊÔ̽Ë÷
Ïà¹ØÎĵµ

×Ô¶¯»¯½Ó¿Ú²âÊÔʵ¼ù֮·
jenkins³ÖÐø¼¯³É²âÊÔ
ÐÔÄܲâÊÔÕï¶Ï·ÖÎöÓëÓÅ»¯
ÐÔÄܲâÊÔʵÀý
Ïà¹Ø¿Î³Ì

³ÖÐø¼¯³É²âÊÔ×î¼Ñʵ¼ù
×Ô¶¯»¯²âÊÔÌåϵ½¨ÉèÓë×î¼Ñʵ¼ù
²âÊԼܹ¹µÄ¹¹½¨ÓëÓ¦ÓÃʵ¼ù
DevOpsʱ´úµÄ²âÊÔ¼¼ÊõÓë×î¼Ñʵ¼ù