生活随笔
收集整理的這篇文章主要介紹了
强大的Mockito测试框架(转)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1、自動(dòng)生成Mock類
在需要Mock的屬性上標(biāo)記@Mock注解,然后@RunWith中配置Mockito的TestRunner或者在setUp()方法中顯示調(diào)用MockitoAnnotations.initMocks(this);生成Mock類即可。
2、自動(dòng)注入Mock類到被測試類
只要在被測試類上標(biāo)記@InjectMocks,Mockito就會(huì)自動(dòng)將標(biāo)記@Mock、@Spy等注解的屬性值注入到被測試類中
import static org.mockito.Mockito.when;import java.util.Collections;
import java.util.List;import javax.annotation.Resource;import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import com.cdai.ssi.user.dao.UserDao;
import com.cdai.ssi.user.domain.UserDomain;
import com.cdai.ssi.user.dto.UserDto;
import com.cdai.ssi.user.service.UserService;@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:spring/spring-config.xml"
})
public class UserServiceTest {@InjectMocks@Resource(name= "userService"
)privateUserService userService;@MockprivateUserDao userDao;@Beforepublicvoid setUp() {MockitoAnnotations.initMocks(this);}@Testpublicvoid testQueryAll() {when(userDao.selectAll()).thenReturn(Collections.<UserDomain>
emptyList());List<UserDto>dtoList =
userService.queryAll();Assert.assertTrue(dtoList.isEmpty());}} @InjectMocks的問題是:如果被測試類是代理類,那么注入會(huì)失效。比如上面的UserService如果是事務(wù)或者其他AOP代理類,那么進(jìn)入@Test方法時(shí)UserService中的DAO屬性不會(huì)被Mock類替換。
3、有些方法想Mock定制,有些想調(diào)用真實(shí)方法
因?yàn)?#64;Mock針對接口生成Mock類,所以我們是沒法調(diào)用到真實(shí)的實(shí)現(xiàn)類的方法。可以使用@Spy注解標(biāo)注屬性,并且標(biāo)注@Resource注解讓Spring注入真實(shí)實(shí)現(xiàn)類,那么Mockito就會(huì)自動(dòng)生成Spy類。
例如:
@InjectMocks
@Resource(name ="userService")
privateUserService userService;
@Spy
@Resource
privateUserDao userDao;
Spy類就可以滿足我們的要求。如果一個(gè)方法定制了返回值或者異常,那么就會(huì)按照定制的方式被調(diào)用執(zhí)行;如果一個(gè)方法沒被定制,那么調(diào)用的就是真實(shí)類的方法。
如果我們定制了一個(gè)方法A后,再下一個(gè)測試方法中又想調(diào)用真實(shí)方法,那么只需在方法A被調(diào)用前,調(diào)用Mockito.reset(spyObject);就行了。
import static org.mockito.Mockito.when;import org.mockito.Mockito;public class TestMockObject implementsITestMock {publicstatic void main(String[] args) {ITestMockmock = Mockito.mock(TestMockObject.
class);System.out.println(mock.test1());System.out.println(mock.test2());ITestMockspy = Mockito.spy(
new TestMockObject());System.out.println(spy.test1());System.out.println(spy.test2());when(spy.test1()).thenReturn(100
);System.out.println(spy.test1());Mockito.reset(spy);System.out.println(spy.test1());System.out.println(spy.test2());when(spy.test1()).thenReturn(104
);System.out.println(spy.test1());}@Overridepublicint test1() {System.out.print("RealTest1()!!! - "
);return1;}@Overridepublicint test2() {System.out.print("RealTest2()!!! - "
);return2;}} 輸出為:
0
0
Real Test1()!!! - 1
Real Test2()!!! - 2
Real Test1()!!! - 100
Real Test1()!!! - 1
Real Test2()!!! - 2
Real Test1()!!! - 104
?
http://www.open-open.com/lib/view/open1359969858611.html
?
轉(zhuǎn)載于:https://www.cnblogs.com/softidea/p/4159133.html
總結(jié)
以上是生活随笔為你收集整理的强大的Mockito测试框架(转)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。