JUnit 以接口作为参数测试方法

JUnit Testing a Method with an Interface as the parameter

如标题所述,我想测试以下方法:

Class A:

private List<String> s;
    
public A() {
    s = new ArrayList<String>();
    s.add("Gregor");
    s.add("Example");
    s.add("Example2");
}

public String argr(B b) { //B-> Interface
        int t = b.t();
        String r = "Hello ";
        for(String z:s ) {
            boolean x = b.f(t, 5);
            if(x) {
                r += z;
            }
        }
        return r;
    }

使用接口 B:

public interface B {
    int t();
    boolean f(int t, int i);
}

测试:

class Example{
  public B b;
  private A example = new A();

  @Test
  void test() {
    //assert(example .s() == "Hello GregorExampleExample2");
        
    System.out.println(example .s(b));
        
    //bsp.A(c);
    }

}

问题:方法:b,需要一个Interface作为参数,接口可以通过这个方法实现:Class A implements B{}

问题:测试时无法识别 Class A.

中的接口实现方法

问题 1:jUnit 如何测试以接口作为参数的方法?

问题 2: 是否需要在 jUnit 测试中实现接口方法class,它才能工作?

您可以为每个测试用例创建一个这样的匿名 class:

b = new B() {
    @Override
    public int t() {
        return 0;
    }

    @Override
    public boolean f(int t, int i) {
        return false;
    }
};

只需将 return 值替换为适合您的测试用例的值,但尽量避免在 class 中放置任何逻辑(因为那样您也必须对其进行测试)。

如果你不想为每个测试用例实现接口,另一种可能性是使用 Mockito 来模拟你的接口:

B mock = Mockito.mock(B.class);
Mockito.when(mock.f(Mockito.anyInt(), Mockito.anyInt())).thenReturn(false);