Junit单元测试中whenNew(子类.class)thenReturn(父类)涉及到的类型转换问题

本文探讨了在使用Mockito进行单元测试时,当when条件中返回的值与thenReturn中返回的值类型不一致时的解决方案。提供了两种方法:一是直接在thenReturn中强制类型转换;二是利用Answer方法设置返回值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        在单元测试中,有时候会用到Mockito中的when(...).thenReturn(...)设置方法的返回值,但是有的时候when条件中返回的值,和thenReturn中返回的值的类型不一样,这时会出现Cannot resolve method 'thenReturn()'错误。

        这时可以使用以下两种方法解决:

  1、直接在thenReturn中强制转化成相应类型

HttpClient httpClient=new DefaultHttpClient();
HttpClient spy=spy(httpClient);
whenNew(DefaultHttpClient.class).withNoArguments().thenReturn((DefaultHttpClient) spy);
HttpClient client=new DefaultHttpClient();
client.getParams();
verify(spy).getParams();

 2、利用Answer方法设置返回值

HttpClient httpClient=new DefaultHttpClient();
HttpClient spy=spy(httpClient);
whenNew(DefaultHttpClient.class).withNoArguments().then(new Answer<Object>() {
    @Override
    public Object answer(InvocationOnMock invocation) throws Throwable {
        return spy;
    }
});
HttpClient client=new DefaultHttpClient();
client.getParams();
verify(spy).getParams();

 

public <T extends ViewModel> T getApplicationScopeViewModel(@NonNull Class<T> modelClass) { if (mApplicationProvider == null) mApplicationProvider = new ViewModelProvider(ApplicationInstance.getInstance()); return mApplicationProvider.get(modelClass); } package com.st.base.ui; import static org.junit.Assert.assertNotNull; import static org.mockito.Mockito.mockStatic; import static org.powermock.api.mockito.PowerMockito.mock; import static org.powermock.api.mockito.PowerMockito.when; import static org.powermock.api.mockito.PowerMockito.whenNew; import androidx.appcompat.app.AppCompatActivity; import androidx.lifecycle.ViewModel; import androidx.lifecycle.ViewModelProvider; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.MockedStatic; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; @RunWith(PowerMockRunner.class) @PrepareForTest(ApplicationInstance.class) public class ViewModelScopeTest2 { private ViewModelScope viewModelScope; @Before public void setUp() { viewModelScope = new ViewModelScope(); } @Test public void testGetApplicationScopeViewModel_CreatesProvider() throws Exception { PowerMockito.mockStatic(ApplicationInstance.class); ApplicationInstance mockApplication = mock(ApplicationInstance.class); when(ApplicationInstance.getInstance()).thenReturn(mockApplication); ViewModelProvider mockProvider = mock(ViewModelProvider.class); whenNew(ViewModelProvider.class).withArguments(mockApplication).thenReturn(mockProvider); // 3. 调用方法 viewModelScope.getApplicationScopeViewModel(TestViewModel.class); // 4. 验证 mApplicationProvider 被赋值 // assertNotNull(viewModelScope.mApplicationProvider); } // 示例 ViewModel static class TestViewModel extends ViewModel { } } mApplicationProvider = new ViewModelProvider(ApplicationInstance.getInstance()); 在这个地方打桩失败, whenNew(ViewModelProvider.class).withArguments(mockApplication).thenReturn(mockProvider); 导致 mApplicationProvider.get(modelClass); 这里出现空指针异常,给出具体的解决方案
最新发布
07-25
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值