Android测试和模拟:添加到列表中



我得到了以下测试方法(简单地配置):

    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方法已被调用。

那就是我要测试的方式。

相关内容

  • 没有找到相关文章

最新更新