我正试图使用JUnit和Mockito为Android编写一个单元测试(Not插入指令)。
一些上下文:我正在测试一个严重依赖于视图的类,并且我不能/不想在测试期间实际扩展视图。有一次,我要测试的类想要使用视图的宽度,并且我定义了一个(公共)方法,该类在运行时使用该方法来获取宽度(getWidth()
)。
在我的测试中,我只想使用Mockito来模拟getWidth()
方法。(同时让班上的其他同学以同样的方式行事)。澄清一下:我的类中有一个方法调用getWidth()
,我希望它在测试期间返回一个模拟值。
因此,我尝试使用Mockito.spy()
方法实例化Class,但我不知道这是正确的方法(不起作用),还是我应该做其他事情
我当前的代码:
mGraph = Mockito.spy(new Graph(xAxis, leftAxis, null, false, new Graph.Style(), curve));
Mockito.when(graph.getGraphWidth()).thenReturn(400);
我收到以下错误消息,但我不知道它是相关的还是另一个错误:
java.lang.IllegalArgumentException: dexcache == null (and no default could be found; consider setting the 'dexmaker.dexcache' system property)
我通过更改中的build.gradle解决了这个问题
testCompile ('junit:junit:4.12',
'com.google.dexmaker:dexmaker-mockito:1.0',
'com.google.dexmaker:dexmaker:1.0')
到这个
testCompile ('junit:junit:4.12',
'org.mockito:mockito-core:1.9.5')
我想这可能是因为dex依赖项应该只与androidTestCompile
标记一起使用。
您的间谍语法是正确的,但您有两个危险:
-
你可能还需要一些手动配置,正如Adil Hussain在这个SO回答中所说:
System.setProperty( "dexmaker.dexcache", getInstrumentation().getTargetContext().getCacheDir().getPath());
-
小心
Mockito.when(graph.getGraphWidth()).thenReturn(400);
包含对的调用
graph.getGraphWidth()
Mockito会在截尾前打电话。这对于这个调用来说可能很好,但在实际方法调用将抛出异常的情况下,
Mockito.when
语法没有帮助。相反,使用doReturn
:Mockito.doReturn(400).when(graph).getWidth();
请注意,对
when
的调用只针对图,而不是整个方法调用,这允许Mockito禁用所有行为(包括调用真实方法),并且只使用方法调用来识别方法。