簡體   English   中英

Java - 如何通過使用 Mockito 模擬 impl

[英]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 注釋

https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.testing.spring-boot-applications.mocking-beans

如果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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM