Mockito Stub意外行为

时间:2018-08-31 14:41:23

标签: java mockito

我知道我不应该这样使用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

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