【问题标题】:How to create a instance of Set<?> in Java?如何在 Java 中创建 Set<?> 的实例?
【发布时间】:2015-12-15 15:58:33
【问题描述】:

我正在编写一个单元测试,我在其中对各种类进行存根,并且在某个阶段我需要返回 Set 的一个实例作为值。如何创建实例并在其中插入值。以下是我尝试过的编译错误

private Set<?> keys;
String[] keys1 = new String[2];
keys1[0] =  "filter1";
keys1[1] = "filter2";
keys = new HashSet<>(Arrays.asList(keys1));

when(ctx.getFilter()).thenReturn(keys);

【问题讨论】:

  • getFIlter() 的返回类型是什么,你得到的编译错误是什么?
  • 下面是编译错误:java.lang.Error: Unresolved compiler problem: The method thenReturn(Set) in the type OngoingStubbing> 不适用于参数 (Set)

标签: java unit-testing set mockito stubbing


【解决方案1】:

Set&lt;?&gt; 真正的意思是“它是一组某种类型的对象,但我不知道具体是哪种类型。”在无关紧要的情况下,您可以将其设置为您想要的任何类型 - 例如,在您的情况下,您正在制作一组字符串:

String[] keys1 = new String[2];
keys1[0] =  "filter1";
keys1[1] = "filter2";
keys = new HashSet<String>(Arrays.asList(keys1));

【讨论】:

    【解决方案2】:

    假设您在测试方法中有这个。至少有一个错误是你不应该将你的局部变量keys 声明为private

    您可能遇到的另一个问题是ctx.getFilter() 的返回类型,您没有在问题中给出。但它必须与keys 的类型匹配。类型Set&lt;?&gt; 表示任何类型的集合,作为返回类型并不常见,因为不知道内容的类型是什么,所以如果不进行强制转换,你不能对内容做很多事情。

    以下应该有效:

    Set<?> keys;
    String[] keys1 = new String[2];
    keys1[0] =  "filter1";
    keys1[1] = "filter2";
    keys = new HashSet<>(Arrays.asList(keys1));
    
    when(ctx.getFilter()).thenReturn(keys);
    

    【讨论】:

    • 键是全局变量,它已在类级别的函数外部声明。很明显,当我尝试返回 Set> 的实例时,返回类型将为 Set> 并且我看不出您的解决方案与我的其他解决方案有何不同/跨度>
    猜你喜欢
    • 2014-05-02
    • 2018-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-09
    • 2014-06-10
    相关资源
    最近更新 更多