java构造⽅法怎么mock,使⽤JMockit来mock构造函数
Java 测试的 Mock 框架以前是⽤ JMockit, 最近⽤了⼀段时间的 Mockito, 除了它流畅的书写⽅式,经常这也 Mock 不了,那也 Mock 不了,需要迁就于测试来调整实现代码,使得实现极不优雅。⽐如 Mockito 在 私有⽅法,final ⽅法,静态⽅法,final 类,构造⽅法⾯前统统的缴械了。powermock 虽然可作 Mockito 的伴侣来突破 Mockito 本⾝的⼀些局限,但是我⼀⽤它来 Mock ⼀个构造⽅法就出错
Caused by: java.lang.ClassNotFoundException: ptions.Reporter
不得已再祭出 JMockit 这号称(也确实是)⼀⽆所不能的⼤杀器,在此见识⼀下它怎么 Mock 构造函数的
本篇实例所使⽤的 JMockit 版本是 1.30, 当前最新版 1.31, 由于尚未被 Maven 中央仓库收录,所以暂⽤ 1.30。在 l 中如下⽅式引⼊
<dependency>
<groupId>org.jmockit</groupId>
<artifactId>jmockit</artifactId>
<version>1.30</version>
<scope>test</scope>
</dependency>
1
2
3
4
5
6
<dependency>
<groupId>org.jmockit</groupId>
<artifactId>jmockit</artifactId>
<version>1.30</version>
<scope>test</scope>
</dependency>
待测试的代码是类 Example, 代码如下
package cc.unmi;
public class Example {
public String findOneUser(String category) {
if("general".equals(category) || category.equals("admin")) {
return new UserService(new UserDao(), category).findById(123);
}
throw new RuntimeException("Invalid category");
}
}
1
2
3
4
5
6
7
8
9
10
11
packagecc.unmi;
publicclassExample{
publicStringfindOneUser(Stringcategory){
if("general".equals(category)||category.equals("admin")){
returnnewUserService(newUserDao(),category).findById(123);
}
thrownewRuntimeException("Invalid category");
}
}
它的 findOneUser(category) ⽅法中需要根据条件来创建⼀个 UserService 实例,所以未把 UserService 实例声明为 Example 的属性,通过 Example 的构造函数来传⼊,若如此就很容易⽤ Mockito 的 Mock 这个 UserService 实例了。
private UserService userService;
public Exmple(UserService userService) {
this.userService = userServie;
}
上⾯的实现是 Mockito 最喜爱的⼝味了。但由于 userService 并不跟随 Example 创建,所以 Mockito 去 Mock
findOneUser(category) ⾥的 new UserService(userDao,  "admin") 就显⽰得捉襟见肘了。
在使⽤ JMockit mock UserService 构造函数之前,贴出⼀下 UserService 的演⽰实现
package cc.unmi;
public class UserService {
private UserDao userDao;
private final String category;
public UserService(UserDao userDao, String category) {
this.userDao = userDao;
this.category = category;
}
public String findById(int id) {
return userDao.findById(id);
}
}
1
2
3
4
5
6
7
8
9
java接口有没有构造方法10
11
12
13
14
15
packagecc.unmi;
publicclassUserService{
privateUserDaouserDao;
privatefinalStringcategory;
publicUserService(UserDaouserDao,Stringcategory){ this.userDao=userDao;
this.category=category;
}
publicStringfindById(intid){
returnuserDao.findById(id);
}
}
我们要测试的⽬标⽅法是 Example.findOneUser(category), 其中⼀个测试是 userService 实例的 findById(id) ⽅法获得什么它也返回什么,所以单元测试中的 service.findById(id) ⽅法不应该调⽤实际的 userDao 的相应⽅法,也就是我们要 Mock 的⽬的所在。所以本例中的 UserDao 的⽅法并未实现,如下
package cc.unmi;
public class UserDao {
public String findById(int id) {
throw new RuntimeException("not implemented");
}
}
1
2
3
4
5
6
7
packagecc.unmi;
publicclassUserDao{
publicStringfindById(intid){
thrownewRuntimeException("not implemented");
}
}
那么来看测试代码 ExampleTest
package cc.unmi;
import mockit.Expectations;
import mockit.Mocked;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class ExampleTest {
@Mocked
private UserService userService;
@Test
public void testFindOneUser() {
new Expectations() {{
new UserService(withInstanceOf(UserDao.class), "admin");
result = userService;
userService.findById(123);
result = "Hello Yanbin's blog";
}};
Example example = new Example();
String user = example.findOneUser("admin"); assertEquals("Hello Yanbin's blog", user);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。