簡體   English   中英

為什么在單元測試中使用@MockBean 注解時 bean 未初始化

[英]Why bean is not initialized when used @MockBean annotation in unit test

我有一個非常糟糕的 bean 實現

@Component
public class Repository{
    public List<String> people= new ArrayList<>();

我還有一個測試,我用模擬替換了存儲庫。 但是當我嘗試通過存儲庫模擬訪問測試中的“人員”字段時,我得到 NullPointerException

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class MainControllerTest{

    @Autowired
    private MockMvc mockMvc;
        
    @MockBean
    private Repository repository;
           
    @Test
    public void someTest(){
        repository.people // null -> NullPointerException
    }
}

為什么會發生? bean 是否初始初始化? 如此糟糕的實現的正確解決方案是什么?

Bean 初始化為它假設的@MockBean 它只為您生成一個存根。 Repository類的所有嵌套內容都將被忽略。 在您的情況下,您有一個完全初始化的模擬。 但當然它的嵌套字段為空。 因為它是一個模擬並且嵌套的字段不會被初始化。 Mock 假設您只需要某種特定類的包裝器來模擬該類的某些行為。

您需要做的是將@MockBean更改為@SpyBean 在這種情況下,您的類字段將按照它在Repository類中的定義進行初始化。 因此,您將擁有一個真正的Repository對象,但被 Mockito Spy 包裹。 它將允許您對該對象執行所需的所有測試操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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