繁体   English   中英

您如何使用 Mockito 从扩展 class 测试方法?

[英]How do you test method from extended class using Mockito?

我有一个从 B 延伸的 class A。B 具有称为 doB() 的方法。

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

Class B:

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

Class 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()时不会拦截。 这可能吗? 如果不是,那么最好的测试方法是什么?

也许更喜欢 inheritance 的组合。 换句话说,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 如何有助于良好设计的一个示例。

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

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

或使用 Spy 而不是 Mock。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM