在Mockito argLambda匹配器中转换为子类型

时间:2016-10-27 15:43:01

标签: java lambda java-8 mockito

我试图使用Mockito的argLambda matcher来匹配争论的一个领域。我遇到的问题是,我尝试模拟的方法需要一个超级类,它没有我想要匹配的字段/ getter。因此,我无法访问子类的getter以进行匹配。有没有办法将lambda参数强制转换为子类,或者其他一些替代解决方案。

超类:

public abstract class SuperC {
    public abstract void doCoolStuff();
}

子类:

public class SubC extends SuperC{
    private final String someField;
    public String getSomeField() { return someField; }

    public SubC(String f){ this.someField = f; }

    @Override public void doCoolStuff() {}
}

I班试图测试:

public class Target {
    private final Dependency dependency;

    public Target(Dependency d){ this.dependency = d; }

    public String testMe(String s){
        SubC myC = new SubC(s);

        // Want to mock this method that takes a SuperC
        return this.dependency.doThings(myC);
    }
}

依赖类:

public class Dependency {
    // Want to mock this method that takes a SuperC
    public String doThings(SuperC c){ return "NOT MOCKED"; }
}

测试类:

import org.junit.Test;
import org.mockito.Mockito;

import static info.solidsoft.mockito.java8.LambdaMatcher.argLambda;
import static junit.framework.TestCase.assertEquals;
import static org.mockito.Mockito.when;

public class TargetTest {
    @Test
    public void test() {
        Dependency mockDependency = Mockito.mock(Dependency.class);

        // s is SuperC
        when(mockDependency.doThings(argLambda(s -> s.getSomeField()
                  .equals("EXPECTED")))).thenReturn("MOCK");

        Target target = new Target(mockDependency);
        assertEquals("MOCK", target.testMe("EXPECTED"));
    }
}

在这一行中,我无法调用s.getSomeField,因为s解析为SuperC。

        // s is SuperC
        when(mockDependency.doThings(argLambda(s -> s.getSomeField()
                  .equals("EXPECTED")))).thenReturn("MOCK");

错误:

Error:(16, 62) java: cannot find symbol
  symbol:   method getSomeField()
  location: variable s of type TestingJava.SuperC

0 个答案:

没有答案