java - 使用 Mockito 模拟由 spring 应用程序上下文创建的本地对象

标签 java spring mockito

我正在尝试使用 Mockito 框架来模拟一个本地对象,该对象是从 spring 应用程序上下文创建的;但每次我运行应用程序时,它都无法用模拟对象替换原始对象。

这是原始类的代码 spinets:

public void executeMyJob(){
    ApplicationContext springContext = ApplicationContextUtil.getApplicationContext();

    MusicEAO music= (MusicEAO) springContext.getBean("MusicEAO");
    List<Brand> dataList =music.getAll();

    ......
}  

我想模拟 MusicEAO,因此当调用 getAll() 方法时,它将使用模拟对象。

下面是我的测试类代码片段:

@Mock
MusicEAO musicEAO;
when(musicEAO.findAll()).thenReturn(myDefinedList);

如何解决这个问题?

最佳答案

很难从您发布的 cod 中看出,但问题可能是您在测试中模拟 MusicEAO,但您正在执行的代码正在使用 Spring ApplicationContext 来获取对 MusicEAO bean 的引用。

您的原始类不应使用 MusicEAO music= (MusicEAO) springContext.getBean("MusicEAO"); ,而是使用 Spring 使用 @Autowired 通过 Spring 注入(inject) bean构造函数或 setter 方法(或其他依赖项注入(inject)方法)。然后您的测试将能够轻松地注入(inject)模拟版本。

 class MyJobClass {

   MusicEAO music;

   @Autowired
   public MyJobClass(MusicEAO musicEao) {
      this.music = musicEao;
   }

   public void executeMyJob(){

       List<Brand> dataList =music.getAll();

       ......
   } 
}

当你说

every time I run the application it fails to replace the original object with the mocked object

您不必运行应用程序来运行此类的单元测试 - 您是在问如何将模拟注入(inject)到正在运行的应用程序中吗?

.

关于java - 使用 Mockito 模拟由 spring 应用程序上下文创建的本地对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13123510/

相关文章:

单个项目中的 Java 库使用不同版本的 log4j

java - 动态获取当前方法名称的较短方法

java - 格式化整数以在指定位置插入字符

java - 动态注册的第三方 Bean 上的类似 Spring 的后处理器 Hook

java - Spring Boot中的Mockito不模拟对象

Java 和 mySQL,为什么要用数据库中的数据创建类对象?

java - Spring MVC Portlet 操作映射不起作用

java - 使 spring 安全 session 无效

java - 模拟方法返回 Null

模拟集成测试