我在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加载优先级,根本原因是什么,如何修复?
首先,您不需要使用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中: 当你已经在测试用例上配置了特定的运行器时,可以使用第一个解决方案(带有)。 第二个解决方案(带有)更经典,也是我的最爱。代码更简单。使用转轮提供