Mockito可以在调用方法之后将参数返回给方法吗?

时间:2013-05-17 06:08:49

标签: java unit-testing mockito

我是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)或类似的参数。

有没有人对如何处理此问题有所了解?

我是否应该打算伪造对createdResponse的调用呢?

1 个答案:

答案 0 :(得分:7)

您可以使用when...thenAnswerfoo上设置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;
    }
});