未调用 Mockito 存根方法

Mockito stubbed method not being called

我是 Mockito 的新手,在存根方面遇到了麻烦。我想测试一个方法,但是将该方法的一行存根,这是对另一个 class 方法的调用。根据下面的代码,我期待 Optional.empty() 但得到了 Optional.of("str should not be null")。我做错了什么?

public class ClassA {
    public String str;

    public Optional<String> method1() {
        if (str == null) { 
            return Optional.of("str should not be null"); 
        }
        return Optional.empty();
    }
}
        
public class ClassB {
    public String thing;
    public Optional<String> method2() {
        ClassA classA = new ClassA();
        Optional<String> str2 = classA.method1();
        if (str2.isPresent()) return str2;
        if (thing == null) return Optional.of("thing should not be null");
        return Optional.empty();
    }
}

public class ClassBTest {
    @Test
    public void method1_test() {
        ClassB classBSpy = spy(new ClassB());
        ClassA classASpy = spy(new ClassA());
        doReturn(Optional.empty()).when(classASpy).method1();

        assertEquals(Optional.empty(), classBSpy.method2());
    }
}
        

看起来你在这里提供的测试执行成功,我不是Mockito专家,但我认为这主要是因为它会简单地根据方法签名对方法进行存根,return Optional.empty() 并且不关心演员表。

如果我没理解错的话,万一你想存根那个方法的超级调用,我认为 Mockito 不支持这个。有关于此 here 的话题。但是,您可以为此求助于 PowerMockito,我相信它可能具有这样的功能。

要使 ClassA 的存根在 ClaasB 中有效,您需要一种方法将 CLassA 的 Spy/Mock 插入到 CLassB 中,即通过构造函数:

public class ClassB {
    public String thing;

    private ClassA classA = new ClassA();

    public ClassB() {
        super();
    }


    public ClassB(ClassA classA) {
        super();
        this.classA = classA;
    }

    public Optional<String> method2() {
        Optional<String> str2 = classA.method1();
        if (str2.isPresent()) return str2;
        if (thing == null) return Optional.of("thing should not be null");
        return Optional.empty();
    }
}
 

public class ClassBTest {
    @Test
    public void method1_test() {
        ClassA classASpy = spy(new ClassA());
        ClassB classB = new ClassB(classASpy);
        doReturn(Optional.empty()).when(classASpy).method1();

        assertEquals(Optional.empty(), classB.method2());
    }
}

但是测试仍然失败,因为 Optional.empty().isPresent()falsethingnull.