<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>1.6.5</version>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>1.6.5</version>
</dependency>
1.全局变量
业务代码
@Component
public class UserService {
@Autowired
private UserDao userDao;
public int queryUserCount(){
return userDao.queryCount();
}
public void saveUser(User user){
userDao.insert(user);
}
}
@Component
public class UserDao {
public int queryCount(){
throw new UnsupportedOperationException();
}
public void insert(User user){
throw new UnsupportedOperationException();
}
}
public class User {
}
单元测试
@RunWith(PowerMockRunner.class)
public class UserServiceTest {
@InjectMocks
private UserService userService;
@Mock
private UserDao userDao;
@Test
public void queryUserCount() {
Mockito.when(userDao.queryCount()).thenReturn(1);
int result = userService.queryUserCount();
assertTrue(result == 1);
}
@Test
public void saveUser() {
User user = new User();
PowerMockito.doNothing().when(userDao).insert(new User());
userService.saveUser(user);
Mockito.verify(userDao,Mockito.times(1)).insert(user);
}
}
2.局部变量
业务代码
public class UserService {
public int queryCount(){
UserDao userDao = new UserDao();
return userDao.queryCount();
}
public void save(User user){
UserDao userDao = new UserDao();
userDao.insert(user);
}
}
public class UserDao {
public int queryCount(){
throw new UnsupportedOperationException();
}
public void insert(User user){
throw new UnsupportedOperationException();
}
}
public class User {
}
单元测试
@RunWith(PowerMockRunner.class)
@PrepareForTest({UserService.class})
public class UserServiceTest {
@Test
public void queryCount() throws Exception {
UserDao userDao = PowerMockito.mock(UserDao.class);
PowerMockito.whenNew(UserDao.class).withNoArguments().thenReturn(userDao);
PowerMockito.when(userDao.queryCount()).thenReturn(1);
UserService userService = new UserService();
int i = userService.queryCount();
assertTrue(1==i);
}
@Test
public void save() throws Exception {
User user = new User();
UserDao userDao = PowerMockito.mock(UserDao.class);
PowerMockito.whenNew(UserDao.class).withNoArguments().thenReturn(userDao);
PowerMockito.doNothing().when(userDao).insert(user);
UserService userService = new UserService();
userService.save(user);
}
}
3. 静态变量
1.如果静态变量是new来的,处理方式和局部变量的一样 业务代码
public class UserService {
private static UserDao userDao = new UserDao();
public int queryCount() {
return userDao.queryCount();
}
public void save(User user) {
userDao.insert(user);
}
}
public class UserDao {
public int queryCount() {
throw new UnsupportedOperationException();
}
public void insert(User user) {
throw new UnsupportedOperationException();
}
}
public class User {
}
单元测试
@RunWith(PowerMockRunner.class)
@PrepareForTest({UserService.class})
public class UserServiceTest {
@Test
public void queryCount() throws Exception {
UserDao userDao = PowerMockito.mock(UserDao.class);
PowerMockito.whenNew(UserDao.class).withNoArguments().thenReturn(userDao);
Mockito.when(userDao.queryCount()).thenReturn(1);
UserService userService = new UserService();
int result = userService.queryCount();
assertTrue(result == 1);
}
@Test
public void save() throws Exception {
UserDao userDao = PowerMockito.mock(UserDao.class);
PowerMockito.whenNew(UserDao.class).withNoArguments().thenReturn(userDao);
Mockito.when(userDao.queryCount()).thenReturn(1);
UserService userService = new UserService();
User user = new User();
PowerMockito.doNothing().when(userDao).insert(user);
userService.save(user);
}
}
2.静态变量是调用静态方法创建的 业务代码
public class UserService {
private static UserDao userDao = UserDaoUtil.getUserDao();
public int queryCount() {
return userDao.queryCount();
}
public void save(User user) {
userDao.insert(user);
}
}
public class UserDaoUtil {
public static UserDao getUserDao(){
return null;
}
}
public class UserDao {
public int queryCount() {
throw new UnsupportedOperationException();
}
public void insert(User user) {
throw new UnsupportedOperationException();
}
}
public class User {
}
单元测试
@RunWith(PowerMockRunner.class)
@PrepareForTest({UserDaoUtil.class})
public class UserServiceTest {
@Test
public void queryCount() {
UserDao userDaoMock = PowerMockito.mock(UserDao.class);
PowerMockito.mockStatic(UserDaoUtil.class);
PowerMockito.when(UserDaoUtil.getUserDao()).thenReturn(userDaoMock);
Mockito.when(userDaoMock.queryCount()).thenReturn(10);
UserService userService = new UserService();
int result = userService.queryCount();
assertTrue(result == 10);
}
@Test
public void save() {
UserDao userDaoMock = PowerMockito.mock(UserDao.class);
PowerMockito.mockStatic(UserDaoUtil.class);
PowerMockito.when(UserDaoUtil.getUserDao()).thenReturn(userDaoMock);
PowerMockito.doNothing().when(userDaoMock).insert(new User());
UserService userService = new UserService();
userService.save(new User());
}
}
4.静态方法mock
业务代码
@Component
public class UserService {
public int queryUserCount() {
return UserDao.getCount();
}
public void saveUser(User user) {
UserDao.save(user);
}
}
public class UserDao {
public static int getCount() {
throw new UnsupportedOperationException();
}
public static void save(User user) {
throw new UnsupportedOperationException();
}
}
public class User {
}
单元测试
@RunWith(PowerMockRunner.class)
@PrepareForTest({UserDao.class})
public class UserServiceTest {
@InjectMocks
private UserService userService;
@Test
public void queryUserCount() {
PowerMockito.mockStatic(UserDao.class);
PowerMockito.when(UserDao.getCount()).thenReturn(10);
int i = userService.queryUserCount();
Assert.assertTrue(i == 10);
}
@Test
public void saveUser() {
PowerMockito.mockStatic(UserDao.class);
PowerMockito.doNothing().when(UserDao.class);
userService.saveUser(new User());
PowerMockito.verifyStatic();
}
}
5.mock静态代码块,以及给静态属性赋值
业务代码
@Component
public class UserService {
private static UserDao userDao;
static {
userDao = new UserDao();
System.out.println("execute static");
}
public int queryUserCount() {
return userDao.getCount();
}
public void saveUser(User user) {
userDao.save(user);
}
}
public class UserDao {
public int getCount() {
throw new UnsupportedOperationException();
}
public void save(User user) {
throw new UnsupportedOperationException();
}
}
public class User {
}
单元测试
@RunWith(PowerMockRunner.class)
@SuppressStaticInitializationFor("com.basci.powermock.mockstatic.block.UserService")
public class UserServiceTest {
@InjectMocks
private UserService userService;
@Test
public void queryUserCount() throws IllegalAccessException {
UserDao userDao = mock(UserDao.class);
Field field = PowerMockito.field(UserService.class, "userDao");
field.set(UserService.class, userDao);
PowerMockito.when(userDao.getCount()).thenReturn(10);
int result = userService.queryUserCount();
Assert.assertTrue(result == 10);
}
@Test
public void saveUser() throws IllegalAccessException {
UserDao userDao = mock(UserDao.class);
Field field = PowerMockito.field(UserService.class, "userDao");
field.set(UserService.class, userDao);
User user = new User();
PowerMockito.doNothing().when(userDao).save(user);
userService.saveUser(user);
Mockito.verify(userDao,Mockito.times(1)).save(user);
}
}
6.mock 私有方法
@Component
public class UserService {
@Autowired
private UserDao userDao;
private int queryUserCount(){
return userDao.queryCount();
}
private void saveUser(User user){
userDao.insert(user);
}
}
@Component
public class UserDao {
public int queryCount(){
throw new UnsupportedOperationException();
}
public void insert(User user){
throw new UnsupportedOperationException();
}
}
public class User {
}
单元测试
@RunWith(PowerMockRunner.class)
public class UserServiceTest {
@InjectMocks
private UserService userService;
@Mock
private UserDao userDao;
@Test
public void queryUserCount() throws InvocationTargetException, IllegalAccessException {
PowerMockito.when(userDao.queryCount()).thenReturn(10);
Method method = PowerMockito.method(UserService.class, "queryUserCount");
int result = (int) method.invoke(userService);
Assert.assertTrue(result == 10);
}
@Test
public void save() throws InvocationTargetException, IllegalAccessException {
User user = new User();
PowerMockito.when(userDao.queryCount()).thenReturn(10);
Method method = PowerMockito.method(UserService.class, "saveUser", User.class);
method.invoke(userService,user);
Mockito.verify(userDao,Mockito.times(1)).insert(user);
}
}
7.mock异常
业务代码
@Component
public class UserService {
@Autowired
private UserDao userDao;
public int queryUserCount(){
return userDao.queryCount();
}
public void saveUser(User user){
userDao.insert(user);
}
}
@Component
public class UserDao {
public int queryCount(){
throw new UnsupportedOperationException();
}
public void insert(User user){
throw new UnsupportedOperationException();
}
}
public class User {
}
单元测试
@RunWith(PowerMockRunner.class)
public class UserServiceTest {
@InjectMocks
private UserService userService;
@Mock
private UserDao userDao;
@Test
public void queryUserCount() {
try {
PowerMockito.when(userDao.queryCount()).thenThrow(new RuntimeException("1234"));
userService.queryUserCount();
fail("不能执行到这行代码");
}catch (Exception e){
Assert.assertTrue(e instanceof RuntimeException);
}
}
@Test
public void saveUser() {
try {
User user = new User();
PowerMockito.doThrow(new ReadPendingException()).when(userDao).insert(user);
userService.saveUser(user);
fail("不能执行到这行代码");
}catch (Exception e){
Assert.assertTrue(e instanceof ReadPendingException);
}
}
}
8.mock同一个类中的方法调用
业务代码
@Component
public class UserService {
@Autowired
private UserDao userDao;
public int queryUserCount(String name){
return getCount(name);
}
private int getCount(String name) {
throw new UnsupportedOperationException();
}
public void saveUser(User user){
save(user);
}
private void save(User user) {
throw new UnsupportedOperationException();
}
}
@Component
public class UserDao {
public int queryCount(){
throw new UnsupportedOperationException();
}
public void insert(User user){
throw new UnsupportedOperationException();
}
}
public class User {
}
单元测试
@RunWith(PowerMockRunner.class)
@PrepareForTest(UserService.class)
public class UserServiceTest {
@InjectMocks
private UserService userService;
@Test
public void queryUserCount() throws Exception {
UserService spy = PowerMockito.spy(userService);
PowerMockito.doReturn(1).when(spy,"getCount","nametest");
spy.queryUserCount("nametest");
}
@Test
public void saveUser() throws Exception {
User user = new User();
UserService spy = PowerMockito.spy(userService);
PowerMockito.doNothing().when(spy,"save",user);
spy.saveUser(user);
}
}
|