一.外部測試用例創(chuàng)建new對象時,構造函數(shù)里因執(zhí)行super(context);會報錯,尋找解決方法
oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMyNjc1MjY3,size_16,color_FFFFFF,t_70#pic_center)
```java
// super調用到這里
public AbsAction(Context var1) {
boolean var10000 = true;
JniLib1606719255.cV(new Object[]{this, var1, 4});
}
```
1.使用powermock.spy(new ActionExecuter(context));因還是會調用構造函數(shù),*Failed*
2.不能使用打樁@Mock,因為需要測試該類中的其它方法(此為目的) *Failed*
3.反射:“獲取類中的有殘構造方法就可以通過反射**執(zhí)行這個有參構造方法**就可以構建對象” ,*Failed*
4.不創(chuàng)建對象,直接調用方法,根本原理上就無法實現(xiàn) *Failed*
5.`PowerMockito.mockStatic(JniLib1606719255.class);`也不行,會報錯(安卓原生問題):*Failed*
```java
java.lang.UnsatisfiedLinkError: android.util.Log.println_native(IILjava/lang/String;Ljava/lang/String;)I
at android.util.Log.println_native(Native Method)
at android.util.Log.e(Log.java:240)
```
6.外部新建類繼承該源碼類:因該類只有有參構造函數(shù),繼承出來的類中的構造函數(shù)還是要執(zhí)行super才行,否則報錯:`There is no default constructor available in 'com.desaysv.adapter.sceneengine.ActionExecuter'` *Failed*
7.在第6方法上,繼承后,寫一個有參構造函數(shù),再寫一個無參構造函數(shù),也不行。和6同理 *Failed*
8.放棄,改源碼,加個無參構造函數(shù),也不行,和6、7同樣情況 *Failed*
9.沒法搞,該類暫無法單元測試,使用實機的灰盒繼承測試
二、Powermockito.doNothing提示錯誤:
```cpp
Cannot access org.mockito.stubbing.BaseStubber
```
1.添加mockito-all依賴,不行: `testImplementation group: 'org.mockito', name: 'mockito-all', version: '1.10.19'` *Failed*
2.Mockito-core 3.8+因將DoesNothing()改為了私有,無視即可,直接運行:
```cpp
public static PowerMockitoStubber doNothing() {
return POWERMOCKITO_CORE.doAnswer(new DoesNothing());
}
``
```cpp
//.Mockito-core 3.8
private DoesNothing() {}
```
三、mock對象空指針問題,(記錄)
```cpp
//測試代碼
repositoryProxy = PowerMockito.mock(RepositoryProxy.class);
repositoryProxy.bind(Mockito.any(),Mockito.any(),Mockito.any());
```
會報錯:
```cpp
java.lang.NullPointerException
at com.desaysv.adapter.sceneengine.manager.MediaManagerTest.init(MediaManagerTest.java:57)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:68)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:316)
at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:89)
at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:97)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:300)
```
四、Mockito.verify()參數(shù)報錯問題
```objectivec
//源碼
Mockito.verify(repositoryProxy).bind(context,Target.RADIO,Mockito.any());
```
```
org.mockito.exceptions.misusing.InvalidUseOfMatchersException:
Invalid use of argument matchers!
3 matchers expected, 1 recorded:
-> at com.desaysv.adapter.sceneengine.manager.MediaManagerTest.init(MediaManagerTest.java:59)
This exception may occur if matchers are combined with raw values:
//incorrect:
someMethod(anyObject(), "raw String");
When using matchers, all arguments have to be provided by matchers.
For example:
//correct:
someMethod(anyObject(), eq("String by matcher"));
```
方法:按照要求修改參數(shù),如Matchers.eq(Target.RADIO),改為:
```objectivec
Mockito.verify(repositoryProxy).bind(Matchers.eq(context),Matchers.eq(Target.RADIO),Mockito.any());
```
此來源:[https://stackoverflow.com/questi ... ofmatchersexception](https://stackoverflow.com/questi ... ofmatchersexception)
五、MeadiPlayer等安卓原生類無法被mock
六、今天ROBO配置與測試卡在如下報錯:2021-04-01
```objectivec
WARNING: No manifest file found at .\AndroidManifest.xml.
No such manifest file: .\AndroidManifest.xml
Falling back to the Android OS resources only.
To remove this warning, annotate your test class with @Config(manifest=Config.NONE).
[Robolectric] com.desaysv.adapter.sceneengine.manager.RoboTest.myTest: sdk=27; resources=legacy
[Robolectric] NOTICE: legacy resources mode is deprecated; see robolectric點org/migrating/#migrating-to-40
```
問題點可能出現(xiàn)在@config()中無法配置如下內容導致,仍待研究。。。
```objectivec
constants = BuildConfig.class
```
七、模擬測試回調函數(shù)時,用powermock或者Mockito.doAnswer()都可以,因此可以運用在安卓實機測試上,如:
```objectivec
//onPreparedListener = (MediaPlayer.OnPreparedListener)ol;獲取到要測試的回調函數(shù)
doAnswer(new Answer<Object>() {
public Object answer(InvocationOnMock invocation) throws IOException {
Object[] args = invocation.getArguments();
Object ol = args[0];
if(ol instanceof MediaPlayer.OnPreparedListener){
onPreparedListener = (MediaPlayer.OnPreparedListener)ol;
}
return null;
}
}).when(mediaPlayer).setOnPreparedListener(Mockito.any(MediaPlayer.OnPreparedListener.class));
```
來源模仿:[www點voidcn點com/article/p-kpzdmtlj-bsv.html](www點voidcn點com/article/p-kpzdmtlj-bsv.html)
八、安卓實機測試注意 場景/response/空指針 判斷
|