0

我有一个实现接口 I 的单例类 S。单例类有一个方法 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,因此我的测试失败。任何人都可以帮助并让我知道我是否在这里做错了什么。

4

1 回答 1

0

您的代码经过一些修改后可以按预期编译和运行。这是一个自包含的运行示例。

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
    }
}
于 2020-01-29T05:39:33.780 回答