我已经模拟了存储库和数据源,并在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() 方法吗?我已经在应用程序中手动测试,它会创建新对象。只是试图使用 Mockito 从单元测试中做到这一点,我被卡住了。我使用的是ORM,而不是直接的SQlite操作。我需要对此的第二意见。谢谢。
如果您模拟了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