如何以类型安全的方式Mock泛型类型?是否有更多类型安全替代方案?
类型安全地Mock泛型类型的方案
1. 使用@Mock注解声明泛型字段
直接在测试类中用@Mock注解声明带泛型参数的字段,通过Mockito注解初始化后,无需强制转换,完全类型安全。
示例代码:
class HeadersFilterTest { @Mock private ObjectProvider<List<HttpHeadersFilter>> headersFiltersProviderMock; @Mock private HttpHeadersFilter filterMock; @BeforeEach void setUp() { MockitoAnnotations.openMocks(this); } @Test void getHeadersFilter_ifNull_delegatesToInjectedObjectProvider() { given(headersFiltersProviderMock.getIfAvailable()).willReturn(List.of(filterMock)); // 执行测试逻辑并验证 } }
2. Mock泛型类的匿名子类
对于自定义泛型类(比如GenericType<ImportantTypeArgument>),可以创建一个保留泛型信息的匿名子类,再对其进行Mock,避免未检查转换。
示例代码:
@Test void testGenericType() { // 创建匿名子类保留泛型类型信息,Mock时无类型警告 GenericType<ImportantTypeArgument> genericType = mock(new GenericType<ImportantTypeArgument>() {}); // 剩余测试代码 }
3. 通过TypeToken/TypeReference指定泛型类型
借助TypeToken(Guava)或TypeReference(Spring)获取泛型的Type对象,传给Mockito的mock()方法,实现类型安全的Mock。
示例代码(使用Spring的TypeReference):
@Test void testObjectProvider() { HttpHeadersFilter filterMock = mock(HttpHeadersFilter.class); // 获取泛型类型的Type对象 Type providerType = new TypeReference<ObjectProvider<List<HttpHeadersFilter>>>() {}.getType(); ObjectProvider<List<HttpHeadersFilter>> headersFiltersProviderMock = mock(providerType); given(headersFiltersProviderMock.getIfAvailable()).willReturn(List.of(filterMock)); // 剩余测试代码 }
4. 使用Mockito的类型安全Mock配置
Mockito支持通过withSettings().typeSafe()配置,显式保证Mock的类型安全,避免未检查转换警告:
@Test void testGenericMock() { ObjectProvider<List<HttpHeadersFilter>> headersFiltersProviderMock = Mockito.mock(ObjectProvider.class, Mockito.withSettings().typeSafe()); // 剩余测试代码 }
这些方案都可以替代@SuppressWarnings("unchecked"),在编译期保证类型安全,避免潜在的类型转换错误。
内容的提问来源于stack exchange,提问作者Powet
相关产品推荐
相关产品推荐

