Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从强制转换操作返回模拟,Mockito,Java_Java_Unit Testing_Junit_Mockito - Fatal编程技术网

从强制转换操作返回模拟,Mockito,Java

从强制转换操作返回模拟,Mockito,Java,java,unit-testing,junit,mockito,Java,Unit Testing,Junit,Mockito,我在这里尝试测试以下代码: public class Something { public String doSomething(MyClass myClass) { return Utils.getPresentationString(myClass) } } public class Utils{ public static String getPresentationString(MyClass myClass) { if (my

我在这里尝试测试以下代码:

public class Something {
    public String doSomething(MyClass myClass) { 
        return Utils.getPresentationString(myClass)
    }
}

public class Utils{
    public static String getPresentationString(MyClass myClass) {
        if (myClass instanceof MySubClass) {
            MySubClass mySubClass = (MySubClass) myClass;
            return mySubClass.getMaskedPresentationString();
        } else {
            return myClass.getPresentationString();
        }
    }
}
因为Utils是静态的,所以在测试Something类时,我以黑盒方式测试它

我试图让这行代码返回一个模拟:

MySubClass mySubClass = (MySubClass) myClass;
所以我能做到

doReturn(MY_MASKED_STRING).when(this.mySubClassMock).getMaskedPresentationString()
然后呢

assertEquals(MY_MASKED_STRING, this.somethingUnderTest.doSomething(this.myClassMock))
我怎么做这样的工作

doReturn(this.mySubClassMock).when(this.myClassMock).<<cast to MySubClass.class>>
doReturn(this.mySubClassMock).when(this.myClassMock)。

该行是一个强制转换,它无法返回尚未返回的内容。但是后来

public static String getPresentationString(MyClass myClass) {
    if (myClass instanceof MySubClass) {
这就是进入该类的对象

因此,您只需要:

MySubClass subclassMock = mock(MySubClass.class);
...

objectUnderTest.getPresentationString(subclassMock);
然后,您的生产代码应该很高兴地转到“ItisaInstanceof”,然后进行强制转换,让您完全控制传入对象

但请注意:这里的“真正”OOP方式是:避免instanceof/cast

return mySubClass.getMaskedPresentationString();
... else
return myClass.getPresentationString()
为什么子类不重写
getPresentationString()
,以返回其他值?如果这是错误的,那么有可能有一个“基本”抽象方法,然后有两个实现吗

长话短说:

  • 直接的答案是:只需传入
    mock(MyClass.class)
    mock(MySubClass.class)
    ,这取决于您要测试的路径
  • 但更好的办法是:完全去掉那个实例/铸件。好的OOP的全部要点就是要避免这样的代码
那条线是一个石膏,它不能返回已经不存在的东西。但是后来

public static String getPresentationString(MyClass myClass) {
    if (myClass instanceof MySubClass) {
这就是进入该类的对象

因此,您只需要:

MySubClass subclassMock = mock(MySubClass.class);
...

objectUnderTest.getPresentationString(subclassMock);
然后,您的生产代码应该很高兴地转到“ItisaInstanceof”,然后进行强制转换,让您完全控制传入对象

但请注意:这里的“真正”OOP方式是:避免instanceof/cast

return mySubClass.getMaskedPresentationString();
... else
return myClass.getPresentationString()
为什么子类不重写
getPresentationString()
,以返回其他值?如果这是错误的,那么有可能有一个“基本”抽象方法,然后有两个实现吗

长话短说:

  • 直接的答案是:只需传入
    mock(MyClass.class)
    mock(MySubClass.class)
    ,这取决于您要测试的路径
  • 但更好的办法是:完全去掉那个实例/铸件。好的OOP的全部要点就是要避免这样的代码
      强制转换是一种编译时检查,在运行时并不重要


      只需传递已配置了正确存根的
      MySubClass
      的模拟实例

      强制转换是一种编译时检查,在运行时并不重要


      只需传递已配置了正确存根的
      MySubClass
      的模拟实例

      你是对的,从来没有意识到我可以直接使用mySubClassMock,你对cast和instanceof也是对的,但是因为这已经在生产中,我的任务是对它进行单元测试,除非我进行代码审查和审计。@Sebastien你就是你决定要做的。把你自己看作欧米加部门,最后一道防线()。你是看门人,是奖励勤奋工人的人,也是撕裂懒惰工人的人。或者诸如此类。你是对的,从来没有意识到我可以直接使用mySubClassMock,你对cast和instanceof也是对的,但是因为这已经在生产中,我的任务是对它进行单元测试,除非我经过代码审查和审计,否则我不能更改它。@Sebastien你就是你决定要做的人。把你自己看作欧米加部门,最后一道防线()。你是看门人,是奖励勤奋工人的人,也是撕裂懒惰工人的人。或者类似的东西。为什么不首先覆盖
      getPresentationString()
      ?为什么不首先覆盖
      getPresentationString()