写个单元测试类,发现没办法模拟dao层的行为,dao层采用mybatisPlus ,经过半天时间的潜心研究终于解决mybatisplus 链式查询的模拟问题,下面放出解决办法

1,自定义的ArgumentMatcher,这里做成了基类,继承后使用



import com.baomidou.mybatisplus.core.conditions.AbstractWrapper;
import org.mockito.ArgumentMatcher;
import org.mockito.Mockito;

public abstract class AbstractMockTest {


    public <T, R, Children extends AbstractWrapper<T, R, Children>> AbstractWrapper<T, R, Children>
    mpWrp(AbstractWrapper<T, R, Children> mock) {
        ArgumentMatcher<AbstractWrapper<T, R, Children>> argumentMatcher = new Eq<>(mock);
        return Mockito.argThat(argumentMatcher);
    }

    private class Eq<T, R, Children extends AbstractWrapper<T, R, Children>>
            implements ArgumentMatcher<AbstractWrapper<T, R, Children>> {

        private AbstractWrapper<T, R, Children> mock;

        public Eq(AbstractWrapper<T, R, Children> mock) {
            this.mock = mock;
        }

        @Override
        public boolean matches(AbstractWrapper<T, R, Children> value) {
            if (!value.getSqlSegment().equals(mock.getSqlSegment())) {
                return false;
            }
            if (!value.getParamNameValuePairs().toString().equals(mock.getParamNameValuePairs().toString())) {
                return false;
            }

            return true;
        }
    }
}

2,使用方法

@PowerMockIgnore({"javax.management.*"})
@RunWith(PowerMockRunner.class)
public class MyTest extends AbstractMockTest {
 
 
@Mock
private UserMapper userMapper;
 
 
 
    @Test
    public void test1(){
      //初始化表信息
      MapperBuilderAssistant mapperBuilderAssistant = new MapperBuilderAssistant(new MybatisConfiguration(), "");

      TableInfoHelper.initTableInfo(mapperBuilderAssistant, User.class);
//重点注意mpWrp的使用
      when(userMapper.selectList(mpWrp(Wrappers.<User>lambdaQuery()
                .eq(User::getId, 1L)))).thenReturn(new User(1));

    }
 
 
}

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐