【问题标题】:mock method with generic and extends in return type具有泛型的模拟方法并在返回类型中扩展
【发布时间】:2012-05-11 16:09:12
【问题描述】:

是否可以使用签名 Set<? extends Car> getCars() 模拟(使用 mockito)方法而没有抑制警告?我试过了:

XXX cars = xxx;
when(owner.getCars()).thenReturn(cars);

但无论我如何声明cars,我总是会遇到编译错误。 例如,当我这样声明时

Set<? extends Car> cars = xxx

我得到标准的通用/模拟编译错误

The method thenReturn(Set<capture#1-of ? extends Car>) in the type OngoingStubbing<Set<capture#1-of ? extends Car>> is not applicable for the arguments (Set<capture#2-of ? extends Car>)

【问题讨论】:

  • 你遇到什么编译错误,你能复制/粘贴吗?
  • 警告抑制、编译失败和异常都是不同的东西......我想你可能会在这里混淆它们。
  • 我试图准确地解释一切。所以再次明确。我想编译我的代码。我也希望该代码没有警告,也没有@SupressWarning。我从来没有提到任何关于例外的事情。希望有帮助
  • 我同意它是 stackoverflow.com/questions/7366237/… 的副本,除了一个实际上是更新的,所以它不是副本。但它有更多的答案。并且可以争论一个更清晰的标题。

标签: java generics mockito


【解决方案1】:

使用 doReturn-when 备用存根语法。

被测系统:

public class MyClass {
  Set<? extends Number> getSet() {
    return new HashSet<Integer>();
  }
}

和测试用例:

import static org.mockito.Mockito.*;

import java.util.HashSet;
import java.util.Set;

import org.junit.Test;

public class TestMyClass {
  @Test
  public void testGetSet() {
    final MyClass mockInstance = mock(MyClass.class);

    final Set<Integer> resultSet = new HashSet<Integer>();
    resultSet.add(1);
    resultSet.add(2);
    resultSet.add(3);

    doReturn(resultSet).when(mockInstance).getSet();

    System.out.println(mockInstance.getSet());
  }
}

不需要错误或警告抑制

【讨论】:

  • 丑但有效。我讨厌这种语法有两个原因。可读性和我们完全放弃使用泛型的事实。用泛型真的不可能吗?
  • 我理解你不喜欢这种语法,我也更喜欢 when-then 语法。我不明白你的意思是用泛型不可能做到这一点。
  • 我说的是doReturn的参数。这是对象。它不以任何方式绑定到应返回的类型。没有编译时类型检查。但是,如果我没有得到更好的答案,我会接受这个,因为正如我所说 - 它有效
  • 确实如此。正如文档所说:“请注意,始终建议将 when(Object) 用于存根,因为它是参数类型安全且更具可读性(尤其是在存根连续调用时)。”但是由于 when() 方法返回一个通用的 OngoingStubbing,其中 T 是提供给 when() 的方法的类型,然后需要调用 thenReturn(T)...我认为没有任何方法可以避免这个编译器错误,它应该发生。你能去掉你存根的方法中的通配符吗?将其改为类参数?
  • 在此处查看答案stackoverflow.com/a/19119230/193606 以获得类型安全的替代方案
猜你喜欢
  • 1970-01-01
  • 2014-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多