我试图使用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