具有泛型和返回类型扩展的模拟方法

2022-09-02 20:04:00

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

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>)

答案 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());
  }
}

无需错误或警告抑制


答案 2

推荐