我有以下課程:
public class Bar {
private final Listener mListener;
public Bar(Listener listener) {
mListener = listener;
}
}
public class Foo {
private final int mIntField;
private final int Bar mBarObject;
public Foo(int intField) {
mIntField = intField;
mBarObject = new Bar(new Listener() { ... });
}
}
目前,我正在為Foo類撰寫測驗,并且由于Bar沒有注入,我正在使用mockConstruction強制模擬呼叫Bar后創建的所有實體。mockConstruction但我想捕獲該建構式(即監聽器)的引數。我怎樣才能做到這一點?
uj5u.com熱心網友回復:
Listener當您在Foo. 因為您使用的是 Mocking 框架,該框架將間接依賴關系與測驗類隔離開來。
讓我們做一個簡單的圖作為例子。假設您的實際依賴路徑如下所示:
Foo -> Bar -> Listener -> Other -> Other2 -> ...
在測驗時Foo,使用 mocking 框架制作MockedBar并消除Bar. 那么,依賴路徑就變得很簡單了:
Foo -> MockedBar
因此,您可以Foo輕松地進行測驗。
為此,只需稍微重構您的代碼。首先,在您的 : 添加一個包私有建構式Foo:
public class Foo {
private final int mIntField;
private final Bar mBarObject;
public Foo(int intField) {
mIntField = intField;
mBarObject = new Bar(new Listener() { ... });
}
// package-private constructor, for test only.
Foo(int intField, Bar bar) {
mIntField = intField;
mBarObject = bar;
}
}
其次,通過建構式注入進行初始化和mockedBar注入。Foo
public class FooTest {
private Foo foo;
@Before
public void setup() {
int intField = 123;
Bar mockedBar = mock(Bar.class);
when(mockedBar.invokeListener()).thenReturn(something);
foo = new Foo(intField, mockedBar);
}
@Test
public void test_foo() {
// test your foo
}
}
就這樣。現在,您不再需要使用魔法功能mockConstruction了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/464436.html
