使用Android中的Mockito测试数据源方法问题

时间:2017-01-31 12:20:48

标签: android unit-testing mockito

我已经模拟了存储库和数据源,并在setup()方法中创建了一个对象。这是我在测试类中保存的新对象方法:

 public class RepositoryTest {

    @Mock
    private Repository repository;

    @Mock
    private DataSource mockDatasource;

    private Object object;

    @Before
    public void setUp() throws Exception {

        mockDatasource = mock(DataSource.class);
        repository = Repository.getInstance(mockDatasource);
        object = new Object("Title", "Description", new ArrayList<SubObject>());
        when(repository.getObject(anyString())).thenReturn(object);

        when(repository.hasObject(any(Object.class))).thenReturn(true);
    }

    @Test
    public void saveObject() throws Exception {
        Object object = mock(Object.class);
         List<SubObject> subobjects = new ArrayList<SubObject>();
         subobjects(new SubObject("title1", "description1"));
         subobjects(new SubObject("title2", "description2"));
         object.setSubObjects(subobjects);

          /*
           * Instruct mockito to do nothing when datasource.saveSubObjects will be called.
           */
        doNothing().when(mockDatasource).saveObject(object);
        repository.saveObject(object);
        verify(mockDatasource, times(1)).saveObject(object);
        System.out.println("objects: " + repository.getObjects());

        //verify(mockDatasource).getObject(object.getId());
        assertTrue(repository.hasObject(object));
    }
}

这失败了,当我调用“repository.getObjects”并且断言失败时,我没有看到该对象。我不知道这是否称为保存。我应该使用doNothing()方法吗?我在app中手动测试了它并创建了新对象。只是尝试使用Mockito进行单元测试,我被卡住了。我使用的是ORM,而不是直接的SQlite操作。我需要对此提出第二意见。谢谢。

1 个答案:

答案 0 :(得分:0)

如果您模拟了repository并且没有指定在调用方法hasObjects时它应该返回什么,并且如果返回类型是bool,则它将默认返回false

您应检查是否已调用负责保存此对象的方法,而不是检查mocekd存储库是否为对象。

public class Test {
    public boolean testMethod() {
        return true;
    }
}

....

Test mocekdTest = Mockito.mock(Test.class);
boolean b = mocekdTest.testMethod();
//b==false <-becouse by default mocked methods return false or null