【发布时间】:2021-09-13 12:12:02
【问题描述】:
我使用构造函数注入测试了一个 Spring bean。注入的 bean 在测试用例中定义为@MockBean,并且还定义了适当的存根:当调用模拟 bean 的某个方法时,它应该返回一个模拟对象。
当我启动测试用例时,我得到一个NullPointerException,因为存根不起作用——该方法总是返回null。
这里是要测试的对象的构造函数:
@Autowired
public MyBeanToTest(msTemplate jmsTemplate) throws JMSException {
this.jmsTemplate = jmsTemplate;
this.cf = this.jmsTemplate.getConnectionFactory(); // cf is always null
cf.createSession(); // NPE
}
这是测试用例:
@SpringBootTest
public class MyTestClass {
@Autowired
MyBeanToTest myBeanToTest;
@MockBean
private JmsTemplate jmsTemplate;
@Mock
private static ConnectionFactory connectionFactory;
@Test
public void testSomething() {
...
when( jmsTemplate.getConnectionFactory() ).thenReturn( connectionFactory );
...
}
}
我假设在调用构造函数时定义的存根尚未激活。 知道如何使它工作吗?
【问题讨论】:
-
从
JmsTemplate获取ConnectionFactory并在构造函数中对其进行操作实际上是个坏主意。你不应该像那样得到ConnectionFactory,只需注入它。看起来该类中的构造一开始就有缺陷(事实上,也很难(呃)测试那种指向该方向的点), -
无论如何
cf.createSession()行将返回NPE,因为cf是一个模拟(它是来自测试类的connectionFactory),并且您没有定义它以防万一调用createSession()方法
标签: java spring unit-testing mockito