【问题标题】:How do you test method from extended class using Mockito?您如何使用 Mockito 从扩展类测试方法?
【发布时间】:2021-01-15 19:18:54
【问题描述】:

我有一个从 B 扩展而来的 A 类。B 有一个名为 doB() 的方法。

在我的测试中,我想在调用 doB() 时返回 A。

B类:

public String doB() {
    return "B";
}

A类:

public class A extends B {
    
    public String doA() {
        String A = doB();
        return A;
    }
}

在我的单元测试中,我想做这样的事情:

@Mock
private A a;

@Test
public void test() {
    when(a.doB()).thenReturn("PASS");
    a.doB();
    //check if it is "PASS"
}

但是,它在调用doB() 时不会拦截。这可能吗?如果没有,最好的测试方法是什么?

【问题讨论】:

    标签: java mockito


    【解决方案1】:

    也许更喜欢组合而不是继承。换句话说,A应该使用 B,而不是A扩展 B。所以B成为A的合作者。

    例如:

    public class B {
        public String doB() {
            return "B";
        }
    }
    
    public class A {
        private B b;
    
        public A(B b) {
            this.b = b;
        }
    
        public String doA() {
            String a = b.doB();
            return a;
        }
    }
    

    所以你的单元测试看起来像:

    public class MyTest {
        @Mock
        private B b;
    
        @InjectMocks
        private A a;
    
        @Test
        public void test() {
            when(b.doB()).thenReturn("PASS");
            a.doA();
            //check if it is "PASS"
        }
    }
    

    这是 TDD 如何促进良好设计的示例。

    【讨论】:

      【解决方案2】:

      由于您正在模拟 A 类,因此该方法不会真正执行,这意味着在您的模拟执行中没有对 doB 的调用。 你应该设置你的模拟来调用真正的方法

      when(a.doA()).thenCallRealMethod();
      verify(a,times(1)).doB();
      

      或者使用 Spy 而不是 Mock。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-03
        • 1970-01-01
        • 2015-04-07
        • 1970-01-01
        • 1970-01-01
        • 2021-02-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多