我是Mockito的新手,在开始大规模重构之前,我试图为一些遗留代码编写测试,并遇到了以下模式,我希望在代码库中经常看到:
...
Foo foo = new Foo(bar, baz);
foo = db.persist(foo); // Save an object to the DB and have the id set
FooTO fooTO = convert(FooTO.class, foo); // Turn foo entity into a foo Transfer Object
Response response = createdResponse(fooTO, foo.getId()); // Prepare a 201 response
return response;
我面临的问题是在对db.persist()的正常调用中,id将在成功持久化foo实体对象后设置。但在测试中,该字段为空,我最终在createdResponse调用中获得NPE。
我已经在我的测试中使用了以下内容:
Db db = Mockito.mock(Db.class);
when(db.persist(any(Foo.class))).then(returnsFirstArg());
但是我希望能够在foo参数返回之前调用setId(100)或类似的参数。
有人对如何解决这个问题有什么见解吗?
我应该寻找假调用creatatedresponse代替?
可以使用when...thenAnswer
设置foo
上的id:
when(db.persist(any(Foo.class))).thenAnswer(new Answer<Foo>() {
@Override
public Foo answer(InvocationOnMock invocation) throws Throwable {
Foo foo = (Foo) invocation.getArguments()[0];
foo.setId(100);
return foo;
}
});