Power Mock使用指南
集成PowerMock
maven引入
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>2.0.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito2</artifactId>
<version>2.0.0</version>
<scope>test</scope>
</dependency>
对象有返回值方法
mapper方法
@Component
public class UserMapperImpl implements UserMapper {
@Override
public int add(User user) {
return 0;
}
@Override
public void update(User user) {
}
}
service方法
@Service
public class UserServiceImpl {
@Autowired
private UserMapper userMapper;
public int add(User user){
return userMapper.add(user);
}
}
单测
@RunWith(PowerMockRunner.class)
public class UserServiceImplTest {
@InjectMocks
private UserServiceImpl userService;
@Mock
private UserMapper userMapper;
@Test
public void add() {
PowerMockito.when(userMapper.add(any(User.class))).thenReturn(1);
int count = userService.add(new User());
Assert.assertEquals(1,count);
}
}
对象没有返回值的方法
mapper方法
@Override
public void update(User user) {
System.out.println("update方法被调用");
}
service方法
public void update(User user){
userMapper.update(user);
}
单测
@Test
public void update() {
PowerMockito.doNothing().when(userMapper).update(any(User.class));
userService.update(new User());
}
静态有返回值方法
静态方法
public class RedisUtil {
public static String get(String key){
return "123";
}
}
service方法
public String getRedis(String key){
return RedisUtil.get(key);
}
单测 使用@PrepareForTest({RedisUtil.class})和PowerMockito.mockStatic(RedisUtil.class);
@RunWith(PowerMockRunner.class)
@PrepareForTest({RedisUtil.class})
public class UserServiceImplTest {
@InjectMocks
private UserServiceImpl userService;
@Mock
private UserMapper userMapper;
@Test
public void getRedis(){
String hello = "hello world";
PowerMockito.mockStatic(RedisUtil.class);
PowerMockito.when(RedisUtil.get(anyString())).thenReturn(hello);
String redisGet = userService.getRedis("hello");
Assert.assertEquals(hello,redisGet);
}
}
静态没有返回值方法
静态方法
public static void set(String key,String vale){
System.out.println("调用实际set方法");
}
service方法
public void setRedis(){
RedisUtil.set("hello","hello world");
}
单测
@Test
public void setRedis() throws Exception {
PowerMockito.mockStatic(RedisUtil.class);
PowerMockito.doNothing().when(RedisUtil.class,"set",anyString(),anyString());
userService.setRedis();
}
私有有返回值方法
私有方法
private String sayHello(){
return "hello";
}
调用方法
public String hello(){
return sayHello();
}
单测
@RunWith(PowerMockRunner.class)
@PrepareForTest({RedisUtil.class,UserServiceImpl.class})
public class UserServiceImplTest {
@InjectMocks
private UserServiceImpl userService;
@Mock
private UserMapper userMapper;
@Test
public void hello() throws Exception {
UserServiceImpl spy = PowerMockito.spy(userService);
PowerMockito.when(spy,"sayHello").thenReturn("hello world");
String hello = spy.hello();
Assert.assertEquals("hello world", hello);
}
}
私有没有返回值方法
私有方法
private void sayNothing(){
System.out.println("nothing");
}
调用方法
public void nothing(){
sayNothing();
}
单测
@Test
public void nothing() throws Exception {
UserServiceImpl spy = PowerMockito.spy(userService);
PowerMockito.doNothing().when(spy,"sayNothing");
spy.nothing();
}
方法内创建对象
构造方法
@Data
public class User {
private String username;
private String password;
public User() {
this.username = "hello";
System.out.println("创建User对象");
}
}
service方法
public void addUser(){
User user = new User();
userMapper.add(user);
}
单测
@Test
public void addUser() throws Exception {
User user = PowerMockito.mock(User.class);
PowerMockito.whenNew(User.class).withNoArguments().thenReturn(user);
userService.addUser();
Assert.assertEquals(null,user.getUsername());
}
静态私有属性
静态属性
private static Integer count = 1;
调用方法
public int getCount(){
return count;
}
单测
@Test
public void getCount(){
Whitebox.setInternalState(UserServiceImpl.class,"count",10);
int count = userService.getCount();
Assert.assertEquals(10,count);
}