目标是模拟方法readInputReader类的输入,以便在运行单元测试时返回特定值。如果我运行下面的代码,那么我会得到:
java.lang.AssertionError:
Expected :1
Actual :0
这意味着模拟不起作用。如何让它在 Java 中工作?
package foo;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
public class InputTest {
private int getInput() {
return new InputReader().readInput();
}
@Test
public void getInputTest() throws Exception {
InputReader sc = mock(InputReader.class);
when(sc.readInput()).thenReturn(1);
assertEquals(1, getInput());
}
}
class InputReader {
int readInput() {
return 0;
}
}
在 getInput 方法中显式创建一个 InputReader。因此,您创建的模拟将不会在任何地方使用。要使用它,您必须致电
@Test
public void getInputTest() throws Exception {
InputReader sc = mock(InputReader.class);
when(sc.readInput()).thenReturn(1);
assertEquals(1, sc.readInput());
}
要以其他方式使用模拟,您可以创建一个成员变量以在getInput中使用。或者使用像 Spring 这样的依赖注入框架。
你实际上是在嘲笑类InputReader
而不是方法InputTest#getInput
。您可以看到差异:
@Test
public void getInputTest() throws Exception {
InputReader sc = mock(InputReader.class);
when(sc.readInput()).thenReturn(1);
assertEquals(0, getInput()); // no mock
assertEquals(1, sc.readInput()); // mock
}