插件窝 干货文章 Mybatis 测试类中调用接口方法报错:如何解决“Non-static method 'list()' cannot be referenced from a static context”?

Mybatis 测试类中调用接口方法报错:如何解决“Non-static method 'list()' cannot be referenced from a static context”?

UserMapper 方法 静态 Mapper 796    来源:    2025-03-31

解决MyBatis测试中"Non-static method cannot be referenced from static context"错误

这个错误表明你试图以静态方式调用非静态方法。在MyBatis中,Mapper接口的方法都是实例方法,不能直接静态调用。以下是几种解决方案:

常见原因和解决方案

1. 没有正确获取Mapper实例

错误示例

// 错误:直接静态调用接口方法
List<User> users = UserMapper.list();

正确做法

// 通过SqlSession获取Mapper实例
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    List<User> users = userMapper.list(); // 正确调用实例方法
} finally {
    sqlSession.close();
}

2. 在Spring环境中使用

如果你使用Spring或Spring Boot:

@Autowired
private UserMapper userMapper; // Spring会自动注入Mapper实例

@Test
public void testList() {
    List<User> users = userMapper.list(); // 正确调用
}

3. 在MyBatis测试中使用

使用MyBatis官方测试工具:

@RunWith(MybatisTestRunner.class)
public class UserMapperTest {

    @Mapper
    private UserMapper userMapper;

    @Test
    public void testList() {
        List<User> users = userMapper.list();
        assertNotNull(users);
    }
}

4. 检查Mapper接口定义

确保你的Mapper接口正确定义:

public interface UserMapper {
    List<User> list(); // 非静态方法
}

常见错误场景

  1. 误将Mapper方法声明为static

    public interface UserMapper {
       static List<User> list(); // 错误!Mapper方法不应是静态的
    }
    
  2. 在静态方法中直接使用Mapper

    @Test
    public static void testList() { // 测试方法不应是静态的
       List<User> users = userMapper.list(); // 会报错
    }
    

总结

这个错误的根本原因是混淆了静态和非静态方法的调用方式。MyBatis的Mapper接口方法都是实例方法,必须通过Mapper接口的实例来调用。根据你的测试环境选择上述合适的解决方案即可解决问题。