Mockito未调用存根方法



我是Mockito的新手,一直在存根方面遇到问题。我想测试一个方法,但截断了该方法的一行,这是对另一个类的方法的调用。根据下面的代码,我期望Optional.empty((,但得到了Optional.of("str不应该为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专家,但我认为这主要是因为它只会根据方法签名存根方法,返回Optional.empty((,而不关心强制转换。

如果我理解正确的话,如果你想截断该方法的超级调用,我认为Mockito不支持这一点。这里有线索。然而,你可以求助于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()falsething是awlaysnull,因此测试仍然失败。

最新更新