[英]Java - How to Mock impl via using Mockito
我在我的班級中創建了這個存儲庫,如下所示:
private static ModuleRepository repository = new ModuleRepository();
它通過以下方式調用:
repository.isModuleCached(moduleType,taxModuleInfo.getModuleYear(), taxModuleInfo.getModuleVersion()
但是,當我嘗試在我的測試類中模擬它時,我實際上無法返回我想要的模擬結果,而是調用實際的存儲庫,就好像我的模擬調用被忽略了一樣。
我的測試用例設置包括:
@Mock
private ModuleRepository repository;
我的測試課程:
when(repository.isModuleCached(anyString(), anyString(), anyString())).thenReturn(resp);
類中的實際存儲庫不是自動裝配的,它是實例化的,也許是這樣?
使用@MockBean 而不是@Mock。 它告訴 Spring Boot 你正在模擬一個自動裝配的 bean。
@MockBean
private ModuleRepository repository;
您的測試還必須使用 @SpringBootTest 注釋
如果ModuleRepository
來自您無法控制的庫,則為它定義一個 Spring Bean,如下所示:
@Configuration
public class RepoConfig {
@Bean
public ModuleRepository getModuleRepository() {
return new ModuleRepository();
}
}
現在您可以使用@Autowired
將其作為 Spring Bean 注入,或者更好的是,使用構造注入。
完成此操作后,您可以在測試中使用@MockBean
:
@MockBean
private ModuleRepository repository;
您應該在測試設置期間初始化所有非 bean 模擬對象
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
}
避免when(xxx.xxx()).thenReturn(xxx)
。
嘗試doReturn(xxx).when(xxx).xxx()
代替。
這是一個例子: doReturn(resp).when(repository).isModuleCached(anyString(), anyString(), anyString());
此外,不會注入存儲庫值。 這是您的示例代碼: private static ModuleRepository repository = new ModuleRepository();
因為您是手動初始化變量,所以您必須使用反射手動將其替換為 Mock 對象。
Spring 提供了ReflectionTestUtils
這將有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.