簡體   English   中英

Mockito:新生成對象的模擬注入成員

[英]Mockito: mock injected member of newly generated object

我想測試以下課程:

public class ClassToTest {
    private List<Bar> bars = new LinkedList<>();

    public makeBarsFromIDs(List<Integer> idList) {
        for (Integer id : idList) {
            Bar bar = new Bar();
            bar.setID(id);
            bars.add(bar);
        }
    }

    public List<String> getFooStringsFromBars() {
        List<String> fooStrings = new LinkedList();
        for (Bar bar : this.bars)
            fooStrings.add(bar.getFooListAsString());
        return fooStrings;
    }
}

在addToBarList中,實例化Bar對象。

public class Bar {
    private int myID;

    @Inject
    private FooRepository fooRepository;

    public setID(int ID) {
        myID = ID;
    }

    public String getFooListAsString() {
        return fooRepository.findByID(myID).toString();
    }
}

Bar使用FooRepository ,我想模擬它。 如果我測試Bar ,則可以正常工作,但是如何測試ClassToTest並仍然模擬FooRepository

我不能只是模擬Bar ,因為創建了具有不同值的多個實例。 而且我需要測試它們是否正確創建。

如果您正在測試ClassToTest ,則實際上不必模擬FooRepository ,因為它將用作此類的黑匣子。 所有你應該做的是模擬出來的Bar ,並寫測試。

但是這樣做,你就必須開始注射之前Bar為dependecy在ClassToTest以同樣的方式,你這樣做是為了FooRepository中的情況Bar

這是因為,如果您的方法中包含以下語句,則將為Bar創建一個新的onject,並且無法用模擬替換它。

Bar bar = new Bar();

進行相關更改后,您的ClassToTest應該如下所示:

public class ClassToTest {

    @Inject
    private Bar bar;

    public addToBarList(barID) {
        bar.setID(fooID);

        List<Foo> fooList = bar.getFooList();
        ...
    }
}

您的測試類應如下所示:

public class SomeTest {

    @Mock
    private Bar bar;

    @InjectMocks
    private ClassToTest testClass;

    @Before
    public void init() {
        Mockito.initMocks(this);
    }

    @Test
    public void testAdd() {
        Mockito.when(bar.getFooList()).thenReturn(Arrays.asList(new Foo()));
        testClass.addToBarList(...);
    }
}

暫無
暫無

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

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