1

我是 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() 的正常调用中,将在成功持久化 foo 实体对象后设置 id。但在测试中,该字段为空,我最终在 createdResponse 调用中获得了 NPE。

我已经在测试中使用了以下内容:

Db db = Mockito.mock(Db.class);
when(db.persist(any(Foo.class))).then(returnsFirstArg());

但是我希望能够在该 foo 参数返回之前调用 setId(100) 或类似的方法。

有没有人对如何解决这个问题有见解?

我应该寻找伪造对 createdResponse 的调用吗?

4

1 回答 1

7

您可以使用when...thenAnswer以下方式设置 id foo

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;
    }
});
于 2013-05-17T06:30:54.310 回答