你怎么做这个模拟工作?

时间:2017-02-12 13:36:48

标签: java unit-testing mockito

目标是模拟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;
    }
}

2 个答案:

答案 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
}