public class abc{
public getTable(String table){
//some complex logic here.//to be skipped while testing
return "schemaName." + table;
}
public buildQueryMethod1(){
String sql = "select fields from "+getTable("table1") +
"union" +
"select fields from " + getTable("table2") +
.
.
.
return sql;
}
}
我想测试 buildQueryMethod1((。如何模拟 getTable 方法,以便它将"ABC."字符串返回到传递给它的参数,并返回结果字符串任意次数,而与传递的参数和调用该方法的次数无关。
即使你应该注入一个单独的类来生成表名,你也可以使用 Mockito 的间谍功能。看起来您的代码无法编译,但是在您的测试中执行以下操作:
public class ExampleTest() {
private abc example = new abc();
@Test
public void test() {
abc spy1 = spy(abc);
stub(spy1. getTable("table1")).toReturn("ABC");
stub(spy1. getTable("table2")).toReturn("ABC")
// do some testing on example...
}
}
您必须导入 Mockito 静态存根和间谍方法。
最好的方法是利用Mockito提供的匹配器:
@Test
public void test() {
abc spyInstance = PowerMockito.spy(abc); //Since it's a public method
//you can probably just use
//Mockito here.
doReturn("ABC.").when(abc).getTable(org.mockito.Matchers.anyString());
//do some testing
}
这与@Ayub的回答没有太大区别。主要区别在于使用anyString()
。
有时,返回传递给该方法的参数很有用。
@Test
public void test() {
abc spyInstance = PowerMockito.spy(abc); //Since it's a public method
//you can probably just use
//Mockito here.
doAnswer(new Answer<String>() {
@Override
public String answer(InvocationOnMock invocation) throws Throwable {
return (String)invocation.getArguments()[0];
}
}).when(abc).getTable(org.mockito.Matchers.anyString());
//do some testing
}
这有点超出您的需求,但可能很有用,尤其是当您将匿名内部类移动到内部类并在多个测试中重用该行为时。