2017-02-12 62 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 
}