如何在java中使用Mockito存根方法



我有一个单例类S,它实现了一个接口I。 单例类有一个方法 A,该方法反过来调用方法 B。 我必须测试方法 A。

这是我的单身班

public class S implements I{
private static S INSTANCE = new S();
public static I getInstance(){
return INSTANCE;
}
public String methodA(){
methodB();
}
}

这就是我的方法在测试类中的外观。

public void testMethodA(){
S so = S.getInstance();
S spy = Mockito.spy(so);
Mockito.doReturn(something).when(spy).methodB(); // I have to cut the dependency of this method B, hence will stub this 
String exp_value = 'X';
assertEquals(exp_value,spy.methodA);
}

问题是,实际的方法 B 被称为存根的 instsead,因此我的测试失败了。 谁能帮忙,让我知道我是否在这里做错了什么。

只需稍作修改即可按预期编译和运行代码。下面是一个独立的运行示例。

public class StackOverflow59960713 {
public interface I {
String methodA();
}
public static class S implements I {
private static S INSTANCE = new S();
public static I getInstance() {
return INSTANCE;
}
public String methodA() {
return methodB();
}
public String methodB() {
return "abc";
}
}
@Test
public void testMethodA() {
S so = (S) S.getInstance();  <== getInstance() returns I not S
S spy = Mockito.spy(so);
Mockito.doReturn("123").when(spy).methodB();
String exp_value = "123";
assertEquals(exp_value, spy.methodA());  <=== methodA() not methodA
}
}

最新更新