我使用建構式注入來測驗一個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[/span
cf.createSession(); // NPE。
}
這里是測驗案例:
@SpringBootTest
public class MyTestClass {
@Autowired
MyBeanToTest myBeanToTest。
@MockBean { @MockBean
private JmsTemplate jmsTemplate;
@Mock
private static ConnectionFactory connectionFactory;
@Test
public void testSomething() {
...
when( jmsTemplate.getConnectionFactory()).thenReturn( connectionFactory )。
...
}
}
我認為當建構式被呼叫時,定義的存根還沒有被激活。 有什么想法可以讓它作業嗎?
uj5u.com熱心網友回復:
你必須使用靜態存根,所以它將存在并在創建背景關系之前被配置。
另一種更簡潔的方法是不要在建構式中呼叫任何東西,而是根據需求用cf.createSession();創建你的會話(它仍然可以是單子)。
另一種方法是完全不使用@MockBean,而只是自己創建GegugProcessingSoapServices。
uj5u.com熱心網友回復:
你的假設是正確的。你最好的選擇是 "手工 "創建Bean,而不是讓Spring自己呼叫建構式。為此,在你的測驗中添加一個@Configuration類,該類有對應的@Bean方法。
未經測驗的例子:
@SpringBootTest
public class MyTestClass {
@Configuration {
static class MyTestClassConfiguration {
@Bean
MyBeanToTest myBeanToTest(jmsTemplate jmsTemplate) {
//太糟糕了,這不是在測驗之內...
when(jmsTemplate.getConnectionFactory())
.thenReturn(connectionFactory)。
...
}
}
}
uj5u.com熱心網友回復:
我建議不要模擬,而是存根于JmsTemplatebean。
@SpringBootTest。
public class MyTestClass {
@Autowired
MyBeanToTest myBeanToTest。
@Autowired @Autowired
private JmsTemplate jmsTemplate;
@Mock
private static ConnectionFactory connectionFactory;
@TestConfiguration
static class Config {
@Bean
public JmsTemplate jmsTemplate() {
return new JmsTemplate() {
public ConnectionFactory getConnectionFactory() {
return connectionFactory。
}
}
}
}
@Test
public void testSomething() {
...
}
}
uj5u.com熱心網友回復:
@AutoWired不打算用于被測驗的類。它不會將Bean帶入建構式中。
解決方案可以是:將Bean帶入建構式中。
MyBeanToTest myBeanToTest = new MyBeanToTest(connectionFactory)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/310304.html
標籤:
上一篇:獲得按時間排序的Jest測驗
