2017-02-12 66 views
0

目标是模拟方法readInput InputReader类,以在我运行单元测试时返回特定值。如果我运行下面的代码,那么我得到:你如何做这个模拟工作?

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

你正在创建一个模拟InputReader,但是你调用的方法(getInput())不使用那个模拟实例。它使用'new InputReader()'。另一个实例是另一个,而不是模拟的InputReader实例。 –

回答

0

您可以在getInput方法中显式创建一个InputReader。所以你创建的模拟不会在任何地方使用。要使用它,你将不得不调用

@Test 
public void getInputTest() throws Exception { 
    InputReader sc = mock(InputReader.class); 
    when(sc.readInput()).thenReturn(1); 

    assertEquals(1, sc.readInput()); 
} 

要以其他方式使用您可以创建amember变量中getInput使用模拟。或者使用像Spring这样的依赖注入框架。

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 
}