簡體   English   中英

如何模擬私有內部類

[英]How to mock a private inner class

我有一個 spring 應用程序,我想在這樣的控制器上創建一個單一測試。 問題是Wrapper類是private內部類,所以測試的時候看不懂Wrapper。 是否可以在不更改控制器類的情況下使用 Mockito 模擬它。 我可以使用 prepareData() 來獲取對象的實例,但我不知道這是否可以用來模擬該對象。

謝謝

@Controller
public class Controller {

    private class Wrapper {
        private Object1 field1;
        private Object2 field2;
        private Object1 method1(){
           ...
        }
        private Object2 method1(){
           ...
        }
    }

    @ModelAttribute("data")
    public Wrapper prepareData() {
            return new Wrapper ();
}

    public String save(@ModelAttribute("data") Wrapper wrapper, BindingResult result, Model model){
        ...
    }
}

所以在我的測試中我會有這樣的東西

@Test
public void usernameEmpty(){

    BindingResult result = Mockito.mock(BindingResult.class);
    Model model = Mockito.mock(Model.class);
    Wrapper data = //how to mock it
    when(data.method1()).then(new Foo1());
    when(data.method2()).then(new Foo2());
    String returned = controller.save(data, result, model);
    ....
}

您的測試是針對方法的,但它測試了整個類的行為。 如果您的內部類是私有的,那么它是一個實現細節。 測試不應該知道的東西。 它在那個內部類中有很多行為,並且您想獨立測試它,也許您應該將其公開並與此類分開。

也許你會想:但是那么……要測試很多代碼(一個非常大的不可分割的東西),我不能測試一些更小的東西嗎? 嗯,是。 測試驅動開發要求進行最少的實現,並且僅當您添加更多測試時才添加更多代碼。 因此,您從一些測試和最小實現開始,然后對它們進行改進,直到測試具有所有規范和代碼所有實現。

所以不用擔心私有內部類。 測試你的課程合同!

暫無
暫無

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

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