当前位置: 首页 > 知识库问答 >
问题:

模拟返回与数组列表相同的参数,该参数已通过

牟黎昕
2023-03-14

我有一个方法,它被用作:

 List<Integer> permittedUserIds= this.getAuthorizationManager()
                    .getPermittedUserIDs(Constants.Permissions.Target.COMMON_DATA, Constants.Permissions.Action.READ,
                            userIdList);

模拟遵循的方法如下:

选项1:

Mockito.when(spied.getPermittedUserIDs(Mockito.anyString(),Mockito.anyString(),Mockito.anyList())).thenAnswer(i -> i.getArguments()[2]);

这甚至不工作,因为我认为只需要do返回工作,然后回答不会在这里工作。

选项 2:

Mockito.doReturn(AdditionalAnswers.returnsLastArg())
                    .when(spied)
                    .getPermittedUserIDs(Mockito.anyString(), Mockito.anyString(), 
                     Mockito.anyList()); 

获取运行时异常:

错误!Java . lang . runtime exception:org . mock ITO . exceptions . misusing . wrongtypeofrentvalue:ReturnsArgumentAt不能由getPermittedUserIDs()返回getPermittedUserIDs()应返回列表

如果您不确定为什么会出现上述错误,请继续阅读。由于语法的性质,可能会出现上述问题,因为:

  • 这种异常可能发生在错误编写的多线程测试中。请参阅Mockito常见问题解答,了解并发测试的限制
  • 间谍被使用when(spy.foo())清除。then()语法。更安全的方法是截获间谍-
    • 使用doReturn|Throw()方法族。更多关于Mockito的javadocs。spy()方法

    请建议如何嘲笑它。其思想是返回作为最后一个参数传入的相同数组列表。

共有1个答案

栾瑞
2023-03-14

使用doAnswer而不是doReturn

这里是例子:

public class AppTest {

    @Test
    void test() {
        Service service = Mockito.mock(Service.class);
        List<Integer> userIdList = Arrays.asList(3,4);

        Mockito.doAnswer(AdditionalAnswers.returnsLastArg())
                .when(service)
                .getPermittedUserIDs(Mockito.anyString(), Mockito.anyString(),
                        Mockito.anyList());

        List<Integer> permittedUserIds= service
                .getPermittedUserIDs("1", "2",
                        userIdList);

        Assertions.assertSame(userIdList,permittedUserIds);
    }

    public interface Service {
        List<Integer> getPermittedUserIDs(String a, String b, List<Integer> userIdList);
    }
}
 类似资料:
  • 函数能够接收参数供自己使用,也可以返回零个或多个值(我们通常把返回多个值称为返回一组值)。相比与 C、C++、Java 和 C#,多值返回是 Go 的一大特性,为我们判断一个函数是否正常执行(参考 第 5.2 节)提供了方便。 我们通过 return 关键字返回一组值。事实上,任何一个有返回值(单个或多个)的函数都必须以 return 或 panic(参考 第 13 章)结尾。 在函数块里面,re

  • 我想使返回数据类型的的函数与传入的参数的数据类型相同。例如,我会这样调用函数: 因为我将一个传递给,所以它返回了一个

  • 问题内容: Varargs: 与 单数组参数: Java 1.6似乎接受/拒绝以下内容: 假设以上内容是正确的,为什么不总是使用varargs而不是单个数组参数呢?似乎免费增加了呼叫者的灵活性。 如果有,专家可以共享内部JVM的不同吗? 谢谢。 问题答案: 数组从Java的开始就出现了,而varargs是最近才添加的。因此,许多旧代码仍然很高兴地使用数组。 还要注意,使用显式数组参数调用通用var

  • 问题内容: 我有以下代码要进行单元测试: 我想,以验证上的第一次调用 返回。 因此,我无法使用,因为那时该方法已经完成并被调用。 因此,我认为我需要在调用发生时已经对调用进行验证。如何使用Mockito做到这一点? 问题答案: 我创建了以下实现: 此答案捕获正在进行的调用的属性。然后可以将其用于简单的断言。该实现使用Java 8 API。如果那不可用,则需要使用能够将转换为捕获值的接口。测试用例中

  • 为了理解TypeScript的精神,我在我的组件和服务中编写了全类型签名,这扩展到了angular2表单的自定义验证函数。 我知道我可以重载函数签名,但这需要每个返回类型的参数不同,因为将每个签名编译为单独的函数: 我还知道我可以返回单个类型(如Promise),它本身可以是多个子类型: 但是,在angular2自定义表单验证器的上下文中,单个签名(一个类型为的参数)可以返回两种不同的类型:带有表