在单元测试中很难创建真实的dao,Mockito能够模拟这些dao,并验证所调用的dao的行为。
同一个dao方法在一个public方法中调用多次,可以根据参数不同采用Mockito的ArgumentMatcher来处理。
如下
// 查询
dao.selectByPrimaryKey(1)
dao.selectByPrimaryKey(2)
// 插入
dao.insert(object1)
dao.insert(object2)
结合guava的伪函数式编程,下面示例代码展示了如何在一次调用中模拟同一dao函数的不同参数返回结果
import com.google.common.base.Predicate;
import javax.annotation.Nullable;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentMatcher;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.runners.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class FunctionTest {
@Mock
private BidDao dao;
/**
* 创建ArgumentMatcher,根据不同参数值来匹配对应的行为
*/
private <T> T createArgumentMatcher(final Predicate<T> predicate) {
return Mockito.argThat(new ArgumentMatcher<T>() {
@Override
public boolean matches(Object argument) {
if (null == argument) {
return false;
}
return predicate.apply((T) argument);
}
});
}
@Test
public void mutipleSelectTest() {
//当主键等于1时返回结果为true
Predicate<Integer> one = new Predicate<Integer>() {
@Override
public boolean apply(@Nullable Integer input) {
return input == 1;
}
};
//当主键等于2时返回结果为true
Predicate<Integer> two = new Predicate<Integer>() {
@Override
public boolean apply(@Nullable Integer input) {
return input == 2;
}
};
// 创建模拟数据
BidEntity oneEntity = new BidEntity();
oneEntity.setBidId(1);
BidEntity twoEntity = new BidEntity();
twoEntity.setBidId(2);
// 分别定义主键为1、2时的返回结果
Mockito.when(dao.selectByPrimaryKey(createArgumentMatcher(one))).thenReturn(oneEntity);
Mockito.when(dao.selectByPrimaryKey(createArgumentMatcher(two))).thenReturn(twoEntity);
// 验证结果
Assert.assertTrue(1 == dao.selectByPrimaryKey(1).getBidId());
Assert.assertTrue(2 == dao.selectByPrimaryKey(2).getBidId());
}
}