我知道我不应该这样使用Mockito,但是我不明白为什么 Mockito 代码:
import 'package:flutter/material.dart';
import 'package:kpop_idol/components/localization.dart';
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => new _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text(widget.title),
),
body: new Center(
child: new Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
new Text(
Translations.of(context).get('app_name'),
),
],
),
),
);
}
}
给出此结果:
public class Demo {
public static void main(String... args){
Foo foo = Mockito.mock(Foo.class);
Mockito.doReturn(-1).when(foo);
System.out.println(foo.myMethod("a"));
System.out.println(foo.myMethod("a"));
}
public interface Foo{
int myMethod(Object o);
}
}
而不是:
0
-1
答案 0 :(得分:1)
doReturn()
缺少参数类型安全性。
来自Mockito.doReturn()
javadoc(强调的不是我的):
在无法使用的极少数情况下使用
doReturn()
when(Object)
。请注意始终建议使用Mockito.when(Object)进行存根 因为它是参数类型安全且更易读的参数(尤其是当 保留连续的通话)。
实际上,您实际上不需要使用when()
,因此您会得到一个奇怪的结果,因为它是允许的。
您想对Mock的返回值进行存根:
Mockito.doReturn(-1).when(foo).myMethod(Mockito.any());
您不想对模拟本身进行打桩:
Mockito.doReturn(-1).when(foo);
这毫无意义:为什么引用foo
会返回某些内容?
或者最好使用Mockito.when()
,它不那么宽松:
Mockito.when(foo).thenReturn(-1); // same oddity will not compile
Mockito.when(foo.myMethod(any())).thenReturn(-1); // but it will compile