本文使用的是jmockit作为测试的基石
系统环境
eclipse
jdk : 1.8
jmockit:1.31
junit:4.12
<!-- https://mvnrepository.com/artifact/org.jmockit/jmockit -->
<dependency>
<groupId>org.jmockit</groupId>
<artifactId>jmockit</artifactId>
<version>1.31</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
测这里写代码片
试实例
本文没有介绍很多使用方法,仅仅推荐一种个人使用感觉很不错的方法仅供参考
准备代码
如下
@RestController
public class MessageApp {
@Autowired
private MessageService messageService;
public void say(String name) {
System.out.println(messageService.say(name));
System.out.println(MessageSay.say(name));
}
}
public class MessageSay {
public static String say(String name) {
return "staic + say " + name;
}
}
public interface MessageService {
String say(String name);
}
@Service
public class MessageServiceImpl implements MessageService {
@Override
public String say(String name) {
// TODO Auto-generated method stub
return "say " + name;
}
}
普通接口和静态方法测试
测试代码如下
package jmockit.demo.test;
import jmockit.demo.MessageService;
import jmockit.demo.MessageSay;
import mockit.StrictExpectations;
import mockit.Tested;
import jmockit.demo.MessageApp;
import mockit.Injectable;
import org.junit.Test;
import mockit.integration.junit4.JMockit;
import org.junit.runner.RunWith;
/**
* 类MessageAppTest.java的实现描述:TODO 类实现描述
*
* @author xupeng 2017年8月30日 下午6:27:03
*/
@RunWith(JMockit.class)
public class MessageAppTest {
@Tested
private MessageApp messageApp;
@Injectable
private MessageService messageService;
private String name = "name";
@Test
public void test() {
new StrictExpectations(MessageSay.class) {
{
messageService.say(name);
result = name;
MessageSay.say(name);
result = "static demo";
}
};
messageApp.say(name);
}
}
严格顺序测试
StrictExpectations是严格有序的打桩方案,测试方法 messageApp.say(name);中内部执行的每一个服务的每一次方法都需要提前进行打桩。这种方式可以完整严格的按着我们的思维测试代码,按着我们期望的一条总线一直走下去。每一步的信息我们都可以验证。
下面是一个对象验证的实例
projectProductDao.insert(withArgThat(new BaseMatcher<ProjectProductDO>() {
@Override
public boolean matches(Object arg0) {
ProjectProductDO productDO = (ProjectProductDO) arg0;
if (!checkParam(productDO)) {
return false;
}
if (!checkAmount(productDO)) {
return false;
}
if (productDO.getProductCode().equals(oss)) {
return true;
}
return false;
}
@Override
public void describeTo(Description arg0) {
}
}));
异常测试
补充一个异常验证的mock的写法,参考代码如下
package jmockit.demo.test;
import org.junit.Test;
import org.junit.Rule;
import org.junit.rules.ExpectedException;
public class ExceptionTest {
@Rule
public final ExpectedException thrown = ExpectedException.none();
@Test
public void test() {
thrown.expect(NoSuchMethodException.class);
// thrown.expect(NullPointerException.class);
exceptionMethod(null);
}
private void exceptionMethod(Object obj) {
obj.toString();
}
}