当前位置: 首页 > 知识库问答 >
问题:

具有spring boot mock bean的mockito初始化返回null

施飞鸿
2023-03-14

我在spring boot项目Beana中定义了一些bean:

@Component
public class BeanA {
    public String getName() {
        return "A";
    }
}
@Component
public class BeanB {
    @Autowired
    private BeanA beanA;

    private String name;

    @PostConstruct
    public void init() {
        this.name = beanA.getName();
    }

    public String getName() {
        return this.name;
    }

}

当我模拟Beana.getName时,它返回null

@RunWith(SpringRunner.class)
@SpringBootTest(classes = { MockitoTestApplication.class })
public class BeanTest {
  @Autowired
  private BeanB beanB;

  @MockBean
  private BeanA beanA;

  @Before
  public void mock() {
    MockitoAnnotations.initMocks(this);
    Mockito.doReturn("mockA").when(beanA).getName();
  }

  @Test
  public void testGetName() {
    System.out.println(beanB.getName()); // return null here
  }
}

我猜这里有一些bean加载优先级,根本原因是什么,如何修复?

共有1个答案

岳京
2023-03-14

首先,您不需要使用mockitoannotations.initmocks(this);@mockbean创建一个模拟并将bean添加到应用程序上下文(添加一个新的bean或替换现有的bean)。从技术上讲,这个mock已经是“mockito powered”了,所以您可以指定对它的期望,等等。

现在,代码的真正问题是,您正在尝试访问@before方法中的bean,该方法在spring发挥作用之前技术上被调用,它是JUnit框架的一部分。

对于这种情况,spring测试库发明了侦听器的概念,它绑定到spring应用程序上下文生命周期,而不是单元测试的生命周期。

因此,从技术上讲,您可以调用mockito.doreturn(“mocka”).when(beanA).getName();从侦听器TestExecutionListener#BeforeTestMethod中执行这项工作。

要获得一般解释,请阅读本文的SO线程,并结合本文的示例进行更深入的说明

 类似资料:
  • 问题内容: 这是无效的代码: 这是一个愚蠢的示例,但是在静态类构造函数中,我们不能这样做。为什么?是否有充分的理由呢?有人对此有更多了解吗? 因此,我应该这样做的原因是在那里结束构建。 谢谢 问题答案: 我认为原因是初始化程序与字段初始化(以及实例初始化程序的构造函数)一起携带。换句话说,JVM仅识别一个位置来初始化静态字段,因此所有的初始化(无论是否以块为单位)都必须在此完成。 因此,例如,当您

  • 我有以下Java代码: 但是,当我运行它时,它会抛出以下错误: 我在do之前初始化了变量。while 循环,并在 try. 中设置值。捕获循环。似乎尚未设置该变量。抱歉,如果这是一个相当基本的问题,但我似乎无法弄清楚。

  • 在这里,我想在测试方法时模拟,我需要模拟变量的初始化。有线索吗? 编辑:我不允许修改Person类。

  • 我在使用Mockito进行单元测试初始化对象时遇到了一些困难 这是我的测试代码 要测试的代码 RecTangleService、CircleService和SquareService用注释我尝试了很多选项,最终得出结论。我没有得到我错在哪里。我试着在网上搜索了很多地方,但找不到任何帮助。

  • 有许多方法可以使用mockito初始化模拟对象。其中什么是最好的方法? 1. 建议我有没有比这些更好的方法...

  • 问题内容: 有很多方法可以使用MockIto初始化模拟对象。其中最好的方法是什么? 1。 2。 [编辑] 3。 如果有其他方法可以建议我… 问题答案: 对于模拟初始化,使用或是严格等效的解决方案。从MockitoJUnitRunner的javadoc中: 当你已经在测试用例上配置了特定的运行器时,可以使用第一个解决方案(带有)。 第二个解决方案(带有)更经典,也是我的最爱。代码更简单。使用转轮提供