我得到了以下测试方法(简单地配置):
public class EntryService {
public void insertEntry(String name, int qantity) {
Entry newEntry = new Entry(name, quantity);
getEntries().put(id, newEntry);
getSharedPrefsHandler().insertUpdate(newEntry, id);
}
public SparseArray<CartEntry> getEntries() {
if (entries == null) {
cartEntries = sharedPrefsHandler.loadAll();
}
return cartEntries;
}
...
}
在这里我的测试类(简单地):
@RunWith(MockitoJUnitRunner.class)
public class EntryServiceTest {
private EntryService entryService;
@Mock private SharedPreferencesHandler sph;
@Mock Context mMockContext;
@Mock private SparseArray<CartEntry> spArr;
@Before
public void before() throws Exception {
this.entryService = new EntryService(sph);
Mockito.when(entryService.getSharedPrefsHandler().loadAll()).thenReturn(spArr);
}
@Test
public void insertOneEntry() {
// Need to get the the real entry list...
entryService.insertEntry(testEntry1, 1);
assertEquals("Entries in list", 1, entryService.getEntries().size());
}
}
当然(由于模拟Sparsearra,这不会返回实际尺寸1。
junit.framework.AssertionfailedError:购物车期望:1 实际:0
现在,我的目标是在入口服务中进入Sparsearray。因为SparseArray在开始时为null,并且它将尝试使用sharedPreferenceHandler.loadall()加载,而在此方法中,将称为sharedprefs.getall()因此,我需要一张空的地图,该地图传递到服务,以发动一个空的sparsearray:
Mockito.when(sph.getSharedPrefs().getAll()).thenReturn(Collections.EMPTY_MAP);
(抛出java.lang.nullpointerexception)如果我之前在方法中尝试使用一个空的非零件sparsearray:
Mockito.when(cartService.getPrefsHandler().loadAll()).thenReturn(new SparseArray<Entry>);
输出:java.lang.runtimeException:放入android.util.sparsearray未嘲笑的方法。
摘要:如何将Android测试与此服务类一起使用添加 and Item,并在服务类中检查列表是否增加并"禁用"(模拟)其他服务/处理程序,例如sharedPreferenceshandler?
我认为您应该瞄准以下内容:
@RunWith(MockitoJUnitRunner.class)
public class EntryServiceTest {
@Mock private SharedPreferencesHandler sphMock;
@InjectMocks
private EntryService entryService;
@Test
public void insertOneEntry() {
// Arrange
SparceArray<Entry> sparceArray = new SparseArray<Entry>();
Mockito.when(sphMock.loadAll()).thenReturn(sparceArray);
// Act
entryService.insertEntry(testEntry1, 1);
// Assert
assertEquals("Entries in list", 1, sparceArray.size());
verify(sphMock).insertUpdate(
Mockito.any(Entry.class, Mockito.any(Integer.class);
}
}
感谢@InjectMocks
MOCKITO将通过Starturctor从开箱即用的Sphmock注入Sphmock。
除了验证数组的大小外,您还应该旨在验证insert
方法已被调用。
那就是我要测试的方式。