我已经模拟了存储库和数据源,并在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操作。我需要对此提出第二意见。谢谢。
答案 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