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 が設定されることです。しかし、テストではそのフィールドは null であり、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 に答える