未调用 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()
是 false
而 thing
是 null
.
我是 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()
是 false
而 thing
是 null
.