gpt4 book ai didi

java - Android 测试和模拟 : add to a List

转载 作者:行者123 更新时间:2023-11-29 19:20:28 27 4
gpt4 key购买 nike

我得到了以下方法来测试(简化):

    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());

}
}

当然(因为 Mock SparseArra,这不会返回实际大小 1。

junit.framework.AssertionFailedError: Entries in cart Expected :1 Actual :0

现在,我的目标是将一个 Entry 放入 EntryService 的 SparseArray 中。因为 SparseArray 在开始时是空的,它会尝试使用 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 中的方法。

总结:如果列表增加并“禁用”(模拟)其他服务/处理程序(例如 SharedPreferencesHandler),我如何使用此服务类的 Android 测试来添加和项目并在服务类中检查?

最佳答案

我认为你应该以这样的目标为目标:

@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 将通过开箱即用的构造函数注入(inject) sphMock。

除了验证数组的大小之外,您还应该着眼于验证 insert 方法是否已被调用。

这就是我要测试的方式。

关于java - Android 测试和模拟 : add to a List,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42612755/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com