Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Mockito在调用方法后能否将参数返回给方法?_Java_Unit Testing_Mockito - Fatal编程技术网

Java Mockito在调用方法后能否将参数返回给方法?

Java Mockito在调用方法后能否将参数返回给方法?,java,unit-testing,mockito,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

我是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实体对象后设置。但在测试中,该字段为null,我最终在createdResponse调用中得到一个NPE

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

Db db = Mockito.mock(Db.class);
when(db.persist(any(Foo.class))).then(returnsFirstArg());
但是我希望能够在返回foo参数之前调用setId(100)或类似的函数

有人对如何实现这一点有见解吗


我应该假装调用createdResponse吗?

您可以在…时使用
,然后使用Answer
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;
    }
});
when(db.persist(any(Foo.class)).thenAnswer(new-Answer()){
@凌驾
publicfoo应答(invocationmock调用)抛出可丢弃的{
Foo Foo=(Foo)invocation.getArguments()[0];
foo.setId(100);
返回foo;
}
});

您可以在…时使用
,然后回答
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;
    }
});
when(db.persist(any(Foo.class)).thenAnswer(new-Answer()){
@凌驾
publicfoo应答(invocationmock调用)抛出可丢弃的{
Foo Foo=(Foo)invocation.getArguments()[0];
foo.setId(100);
返回foo;
}
});

为什么不模拟
Foo
而在(Foo.getId())时编写
。然后返回(1)
?@tieTYT我不认为这是可能的,因为通过
新Foo(bar,baz)直接实例化。这是正在测试的方法。我可以设置Mockito即使在通过调用new创建时也始终提供模拟实例吗?为什么不模拟
Foo
,并在(Foo.getId())时编写
。然后返回(1)
?@tieTYT我不认为这是可能的,因为通过
new Foo(bar,baz)直接实例化。这是正在测试的方法。我是否可以将Mockito设置为始终提供一个模拟实例,即使是通过调用new创建的?