为什么在Idea的mybatis测试类里无法调用接口里的方法?

新手上路,请多包涵

为什么我在测试类里调用UserMapper的list方法时会报错?

这个代码是我按着b站上黑马程序员2023新版JavaWeb开发教程写的。


我寻思我按照视频来的没有出现什么配置错误,代码也没写错,

然后我换了一个项目,在这个项目里没有引入mybatis的依赖,写了UserMapper接口,在测试类里调用UserMapper的list方法出现了一样的错误。Non-static method 'list()' cannot be referenced from a static context

这是什么原因,要怎么解决?

阅读 1.6k
avatarAI BotBETA

这个问题通常是因为在测试类中没有正确地实例化UserMapper对象,因此无法调用其非静态方法。在Java中,非静态方法需要在一个类的实例上调用,而静态方法可以直接在类上调用。

在你的代码中,如果你直接使用UserMapper.list(),那么就会报这个错误。你需要先创建一个UserMapper的实例,然后使用该实例来调用list()方法。

解决这个问题的一种方式是在测试类中添加一个@Autowired注解来自动注入UserMapper的实例。假设你的测试类是UserMapperTest,则可以按照以下方式修改代码:

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.mybatis.spring.annotation.MapperScan;

@SpringBootTest
@MapperScan("com.example.demo.mapper") // 替换为你的Mapper接口所在的包路径
public class UserMapperTest {

    @Autowired
    private UserMapper userMapper; // 自动注入UserMapper的实例

    @Test
    public void testList() {
        List<User> users = userMapper.list(); // 使用userMapper实例调用list方法
        // 断言验证结果是否符合预期
    }
}

请注意,上述代码假设你的测试类位于Spring Boot项目的测试包中,并且已经配置了Spring Boot的测试扫描路径。如果你使用的是其他框架或者没有配置正确的扫描路径,请根据实际情况进行调整。

2 个回答

image.png
上面定义了一个变量userMapper,下面写的是UserMapper,编译器说我心里苦啊,哪来的UserMapper这个变量...注意看IDEA灰色的变量说明你定义了但是没有用到

你的代码写错了,注意java里是大小写区分的,UserMapper类和userMapper对象不是同一种东西。在你的测试类代码中,应该调用的是由myBatis实例化的一个UserMapper的对象,但你直接用UserMapper.list(),这样是在通过类名调用类的静态方法,而你的UserMapper接口里list()方法是非静态的,也就是non-static,因此才会提示你在静态上下文中无法调用non-static方法。正确的写法是,应该在测试类中先注入UserMapper对象声明为userMapper,然后用userMapper.list()从对象上调用.
关于如何注入UserMapper对象,你可以注意一下黑马的老师是怎么写的。注入UserMapper的前提是你的MyBatis相关配置和依赖都正确,spring启动的时候才会加载配置然后生成一个UserMapper的对象放在容器中,然后才能注入。因此你第二个项目尝试不引入myBatis就硬写,这样是忽视了使用mybatis的前提条件。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题