【问题标题】:Mockito when() on method of field在字段方法上模拟 when()
【发布时间】:2017-03-30 17:46:54
【问题描述】:

我正在尝试在简单的应用程序中使用 Mockito 测试交互器,它作为有限状态机工作。

public class Machine {

private OnActionListener mListener;
private ArrayList<State> mStates;
private FSMJsonParser parser;

private State mCurrentState;

public Machine(String jsonConfig, OnActionListener listener, FSMJsonParser parser) throws IOException {

    this.mListener = listener;
    this.parser = parser;
    initStates(jsonConfig);
    mCurrentState = getStateByName("AlarmArmed_AllLocked");
}

private void initStates(String jsonConfig) throws IOException{

    mStates = parser.parseFSMFromJson(jsonConfig);
}

有测试:

@RunWith(PowerMockRunner.class)
@PrepareForTest(FSMJsonParser.class)
public class FSMtest {

@Mock
State state;

@Mock
ControlPresenter presenter;

@Mock
FSMJsonParser parser;

@InjectMocks
Machine machine;

@Before
public void setUp() throws IOException {

    when(parser.parseFSMFromJson(anyString())).thenReturn(parseFSMFromJson(readConfig()));
}

@Test
public void testAlarmArmedAllLockedStateActions() throws IOException{

    machine.lock();
    verify(machine, times(1)).setCurrentState(anyString());

    machine.lockx2();
    verify(machine, times(1)).setCurrentState("AlarmArmed_AllLocked");

    machine.unlock();
    verify(machine, times(1)).setCurrentState("AlarmDisarmed_DriverUnlocked");

    machine.unlockx2();
    verify(machine, times(1)).setCurrentState("AlarmDisarmed_AllUnocked");
}

我通过方法 parseFSMFromJson(readConfig()) 提供了一个解析 JSON(带有状态描述,存储在资产中)。当使用调试模式运行测试时,JSON 被正确解析。但是 Machine 模拟对象的字段没有初始化,并且为 null 并且所有测试都失败了。我需要初始化 ArrayList mStates 才能正确工作 Machine 类。如何正确测试这个类??

【问题讨论】:

    标签: java testing mockito mvp


    【解决方案1】:

    我更喜欢这样做而不是 InjectMocks

    private Machine machine;
    
        @Before
        public void setUp() throws IOException {
            MockitoAnnotations.initMocks(this);
            machine = new Machine(jsConfig, ...., parser);//Since you already have a constructor
    when(parser.parseFSMFromJson(anyString())).thenReturn(parseFSMFromJson(readConfig()));
        }
    

    【讨论】:

      【解决方案2】:

      您需要在 @Before 方法中使用 MockitoAnnotations.initMocks(this),因为您没有使用 MockitoJUnitRunner 运行测试用例(请参阅 https://static.javadoc.io/org.mockito/mockito-core/2.7.20/org/mockito/Mockito.html#mock_annotation)。

      像这样:

      @Before
      public void setUp() throws IOException {
          MockitoAnnotations.initMocks(this);
          when(parser.parseFSMFromJson(anyString())).thenReturn(parseFSMFromJson(readConfig()));
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多