所以我試圖測驗我的 api,當我嘗試使用存盤庫時,它給了我一個空指標例外。
據說我有一個 h2 資料庫用于在我的 application.yml(inside test/resources) 中進行測驗,如下所示:
spring:
profiles:
active: test
datasource:
username:
password:
url: jdbc:h2:mem:testdb;DB_CLOSE_ON_EXIT=FALSE;
platform: h2
這是我的 ControllerAPItest.java
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureTestDatabase
class ControllerAPITest {
@Mock
CompaniaRepository companiaRepository;
@Mock
DefaultGroupRepository defaultGroupRepository;
@Mock
OfficeRepository officeRepository;
@InjectMocks
CompaniaServiceImpl companiaService;
ControllerAPI controllerAPI = new ControllerAPI(companiaService);
@BeforeEach
void setUp() {
Compania compania = new Compania();
compania.setName("companiaTest");
compania.setDominio("dominioTest");
compania.setAltas("altasTest");
compania.setBajas("bajasTest");
compania.setDefault_group(null);
compania.setOffice(null);
companiaRepository.save(compania);
}
@AfterEach
void tearDown() {
companiaRepository.deleteAll();
}
@Test
void getByField() {
}
@Test
void getCompanias() {
System.out.println(controllerAPI.GetCompanias());
}
}
這是我得到的錯誤的輸出:
在 controller.ControllerAPI.GetCompanias(ControllerAPI.java:114) 的 java.lang.NullPointerException 在 controller.ControllerAPITest.getCompanias(ControllerAPITest.java:65)
它指向的那一行說:
companiaRepository.save(compania);
這是完整的錯誤:https : //textdoc.co/eGmu72wa1ydEoJ4T
我的代碼發生了什么?
謝謝!
編輯。這是我的控制器中的 getCompanias。
@ResponseStatus(HttpStatus.OK)
@GetMapping()
public Map<String, List<Compania>> GetCompanias() {
Map<String, List<Compania>> mappedResult = Collections.singletonMap("result", companiaService.getCompanias());
return mappedResult;
// return companiaService.getCompanias();
}
這里使用了 companiaService :
public List<Compania> getCompanias() {
return companiaRepository.findAll();
}
謝謝!
uj5u.com熱心網友回復:
測驗設定有很多問題,我的建議是通讀 mockito 和 spring 測驗基礎知識,例如這里和這里。
測驗設定
首先,代碼混合了不同的測驗設定。注釋@RunWith(SpringRunner.class)建議使用 JUnit4 設定,但 strack 跟蹤表明使用了 JUnit5,因為 jupiter 包位于類路徑 ( org.junit.jupiter.engine.execution....) 上。的@RunWith作為JUnit5依賴于擴展,并且彈簧extention(可被移除@ExtendWith(SpringExtension.class))已經存在作為元注解@SpringBootTest注解(源)。
模擬注解的使用
當您計劃創建 Spring 啟動測驗時,可以使用@MockBean注解將模擬注入到 TestApplicationContext 中。但是,通過@Mock與 with 一起使用@InjectMocks,模擬將僅由 Mockito 創建,而不會在應用程式背景關系中注冊。可以在此處找到有關差異的更多資訊。
模擬準備
模擬是類的“假”實作,用于模擬真實物件的行為。它不是一個真實的物件,它只執行您分配給它的任務。然而,在 setup() 中,該方法嘗試將模擬作為真實物件訪問。這將不起作用,因為它不是設定模擬的正確方法:
// The CompaniaRepository is annotated as being a mock
@Mock
CompaniaRepository companiaRepository;
...
@BeforeEach
void setUp() {
Compania compania = new Compania();
...
// Here a method on the mock is invoked, which has no use
companiaRepository.save(compania);
}
可以在此處找到有關設定 Mockito 模擬的更多資訊。
此外,如果您打算設定資料庫測驗,我不建議模擬存盤庫,因為它減少了使用資料庫的要求(假設沒有需要 H2 的第三個存盤庫)。
最后的事情;最好通過 Web 層執行測驗來測驗 Spring 控制器。使用實體化被測控制器new ControllerApi(...)只會測驗方法,而不是它們映射到的端點。可以在此處找到有關如何測驗 Web 層的出色教程。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/372021.html
