我正在測試我在Android中創建的Fragment
。我完全控制了代碼,所以我可以根據自己的情況對其進行更改。問題是,我不確定我錯過了哪些設計模式以使其合理。Android中的模擬對象未作爲參數傳遞
我正在尋找一種方法來模擬Android中不作爲參數傳遞的對象。 This question表明,您可能想要模擬的任何內容都應該寫入以作爲參數傳遞。
這對某些情況是有意義的,但我無法弄清楚如何讓它在Android上工作,其中有些是不可能的。例如,使用Fragment
,您不得不在回調方法中完成大部分繁重工作。我怎樣才能讓我的嘲弄物體進入碎片?
例如,在這ListFragment
我需要檢索一系列的東西顯示給用戶。我顯示的東西需要動態檢索並添加到自定義適配器。它目前如下所示:
public class MyFragment extends ListFragment {
private List<ListItem> mList;
void setListValues(List<ListItem> values) {
this.mList = values;
}
List<ListItem> getListValues() {
return this.mList;
}
@Override
public void onCreateView(LayoutInflater i, ViewGroup vg, Bundle b) {
// blah blah blah
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
this.setListValues(ListFactory.getListOfDynamicValues());
CustomAdapter adapter = new CustomAdapter(
getActivity(),
R.layout.row_layout,
this.getListValues());
this.setListAdapter(adapter);
}
}
我正在嘗試使用Mockito和Robolectric來做到這一點。
這是我robolectric測試用例的開頭:
public class MyFragmentTest {
private MyFragment fragment;
@Before
public void setup() {
ListItem item1 = mock(ListItem.class);
ListItem item2 = mock(ListItem.class);
when(item1.getValue()).thenReturn("known value 1");
when(item2.getValue()).thenReturn("known value 2");
List<ListItem> mockList = new ArrayList<ListItem>();
mockList.add(item1);
mockList.add(item2);
MyFragment real = new MyFragment();
this.fragment = spy(real);
when(this.fragment.getValueList()).thenReturn(mockList);
startFragment();
}
}
這感覺非常錯誤的。來自mockito api的This section指出,除非你處理遺留代碼,否則你不應該非常頻繁地進行部分模擬。
此外,我實際上不能用這種方法嘲笑CustomAdapter
類。
做這種事情的正確方法是什麼?我是否在Fragment
類中錯誤地構造了一些東西?我想我可能會添加一些私有套件,但這仍然不太合適。
有人可以對此有所瞭解嗎?我很高興重寫,我只想知道一些好的模式,用於處理Fragment
中的狀態,以及我如何使它們可測試。