目标是模拟InputReader类的方法readInput,以便在运行单元测试时返回特定值。如果我运行下面的代码,那么我得到:
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;
}
}
答案 0 :(得分:0)
您在getInput方法中显式创建了一个InputReader。因此,您创建的模拟将不会在任何地方使用。要使用它,您必须致电
@Test
public void getInputTest() throws Exception {
InputReader sc = mock(InputReader.class);
when(sc.readInput()).thenReturn(1);
assertEquals(1, sc.readInput());
}
要使用mock,您可以创建一个在getInput中使用的成员变量。或者使用像Spring这样的依赖注入框架。
答案 1 :(得分:0)
您实际上是在嘲笑班级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
}