Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.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
Java 莫基托';s when()不是';t stubing超类';s法_Java_Unit Testing_Junit_Mockito - Fatal编程技术网

Java 莫基托';s when()不是';t stubing超类';s法

Java 莫基托';s when()不是';t stubing超类';s法,java,unit-testing,junit,mockito,Java,Unit Testing,Junit,Mockito,我让“MyClass”继承自“BaseClass”,其方法doBaseStuff()没有重载: public class BaseClass { public String doBaseStuff(String var1, String var2) { //Do something return someStringValue; } public class MyClass extends BaseClass { public Strin

我让“MyClass”继承自“BaseClass”,其方法
doBaseStuff()
没有重载:

public class BaseClass {
    public String doBaseStuff(String var1, String var2) {
        //Do something
        return someStringValue;
    }

public class MyClass extends BaseClass {
    public String doMyStuff(String var1, String var2) {
        //Do some stuffs
        doBaseStuff(var1, var2);
        //Do more stuffs
        return someStringValue;
    }
}
然后我有一个
MyClass
的测试用例:

@RunWith(MockitoJUnitRunner.class)
public class MyClassTest {

    @InjectMocks
    MyClass myClass;

    public void testDoOtherThing() {
        // Some setups
        when(myClass.doBaseStuff(dummyVar1, dummyVar2))
                .thenReturn("This isn't catching the invocation!");

        myClass.doMyStuff(dummyVar1, dummyVar2);

        // Some verify statements
    }
}
public class MyClass extends BaseClass {
    private Baseclass baseClass;

    ...

         baseClass.doBaseStuff(var1, var2);

    ...

}

public class MyClassTest {
    @InjectMocks
    MyClass myClass;
    @Mock
    BaseClass baseClass;

    ...

    when(baseClass.doBaseStuff(dummyVar1, dummyVar2))
            .thenReturn("This technically works, but ugh...");

    ...

}
但是,
/
时,
doBaseStuff()
语句不会在调用该方法时模仿该行为

作为一种(非常糟糕的)解决方法,我可以将一个单独的
BaseClass
对象声明为
MyClass
的成员:

@RunWith(MockitoJUnitRunner.class)
public class MyClassTest {

    @InjectMocks
    MyClass myClass;

    public void testDoOtherThing() {
        // Some setups
        when(myClass.doBaseStuff(dummyVar1, dummyVar2))
                .thenReturn("This isn't catching the invocation!");

        myClass.doMyStuff(dummyVar1, dummyVar2);

        // Some verify statements
    }
}
public class MyClass extends BaseClass {
    private Baseclass baseClass;

    ...

         baseClass.doBaseStuff(var1, var2);

    ...

}

public class MyClassTest {
    @InjectMocks
    MyClass myClass;
    @Mock
    BaseClass baseClass;

    ...

    when(baseClass.doBaseStuff(dummyVar1, dummyVar2))
            .thenReturn("This technically works, but ugh...");

    ...

}
但是,
MyClass
基类的子类之一具有相同的功能


MyClass
mock有没有办法知道
doBaseStuff()
实现?

您想改用
@Spy

@Spy
MyClass MyClass;
嘲笑者和间谍之间的区别得到了很好的回答

另外,
when().thenReturn()
方法将实际执行real方法。只替换返回值。如果不想执行原始方法,请改用
doReturn()。when()
语法:

doReturn("This technically works, but ugh...").when(myClass).doBaseStuff(dummyVar1, dummyVar2);

myClass
的可能重复项不是模拟项,因此不能存根其方法。