我有以下Spring
要進行單元測驗的組件:
@Component
public class OrderService {
private final DatabaseConnection dbConnection;
private final String collectionName;
@Autowired
public OrderService(
DatabaseConnection dbConnection,
DatabaseConfig databaseConfig) {
this.dbConnection = dbConnection;
this.collectionName = databaseConfig.getCollectionName();
}
//methods etc...
}
該類DatabaseConfig
如下:
@ConfigurationProperties(prefix = "database")
@ConstructorBinding
public class DatabaseConfig {
//methods etc...
}
我正在嘗試在我的OrderService
班級中注入模擬,如下所示:
@RunWith(MockitoJUnitRunner.class)
class OrderServiceTest {
@InjectMocks
OrderService orderService;
@Mock
DatabaseConnection dbConnection; // working as expected
@Mock
DatabaseConfig databaseConfig; // giving null pointer
@Mock
DatabaseCollectionConfig databaseCollectionConfig;
@BeforeEach
public void setup() {
MockitoAnnotations.openMocks(this);
when(databaseConfig.getCollections()).thenReturn(databaseCollectionConfig);
when(databaseCollectionConfig.getCollectionName()).thenReturn("myCollection");
}
當我運行我的測驗課時,我得到:
org.mockito.exceptions.misusing.InjectMocksException:
Cannot instantiate @InjectMocks field named 'OrderService' of type 'class com.my.package.OrderService'.
You haven't provided the instance at field declaration so I tried to construct the instance.
However the constructor or the initialization block threw an exception : null
問題是OrderService
當我除錯此行時在建構式中顯示為空:
this.collectionName = databaseConfig.getCollectionName();
我怎樣才能正確地模擬databaseConfig.getCollectionName()
來解決 null 問題?
uj5u.com熱心網友回復:
無需使用 @InjectMock 注釋,因為您在服務類中使用基于建構式的注入。請像這樣重寫您的測驗用例,然后重試。
@RunWith(MockitoJUnitRunner.class)
class OrderServiceTest {
OrderService orderService;
@Mock
DatabaseConnection dbConnection; // working as expected
@Mock
DatabaseConfig databaseConfig; // giving null pointer
@Mock
DatabaseCollectionConfig databaseCollectionConfig;
@BeforeEach
public void setup(){
when(databaseConfig.getCollections()).thenReturn(databaseCollectionConfig);
when(databaseCollectionConfig.getCollectionName()).thenReturn("myCollection");
orderService = new OrderService(dbConnection, databaseConfig);
}
}
uj5u.com熱心網友回復:
您可以嘗試為該方法創建一個模擬并創建一個物件實體而不是使用InjectMocks
注釋。
@RunWith(MockitoJUnitRunner.class)
class OrderServiceTest {
OrderService orderService;
@Mock
DatabaseConnection dbConnection; // working as expected
@Mock
DatabaseConfig databaseConfig; // giving null pointer
@Mock
DatabaseCollectionConfig databaseCollectionConfig;
@BeforeEach
public void setup() {
(...)
when(databaseConfig.getCollections()).thenReturn(databaseCollectionConfig);
when(databaseCollectionConfig.getCollectionName()).thenReturn("myCollection");
orderService = new OrderService(dbConnection, databaseConfig);
}
uj5u.com熱心網友回復:
模擬行為,而不是價值觀。@ConfigurationProperties
類只是資料的容器;它(一般來說)不做任何事情。new
使用您的測驗值(例如, )創建一個真實的setCollections(testDatabaseCollectionConfig)
。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/535395.html