如何测试新的Button()?

时间:2018-06-19 10:59:58

标签: android button junit powermock

我有一些ButtonCreator.class通过模型创建Android UI元素。有任何想法如何测试吗?

public class ButtonCreator {

    Button createWidget(ButtonComponent buttonComponent, Context context) {
        Button button = new Button(context);
        button.setText(buttonComponent.getText());

        return button;
    }
}

我写了一个测试:

@RunWith(PowerMockRunner.class)
@PrepareForTest({Button.class, Context.class, ButtonCreator.class})
public class CreaterButtonTest {

    @Mock
    Context mContext;
    @Mock
    Button mButton;

    @Test
    public void createWidget() { 
        PowerMockito.whenNew(Button.class).withAnyArguments(). thenReturn(mButton);

        ButtonCreator buttonCreator = new ButtonCreator();
        ButtonComponent buttonComponent = new ButtonComponent();
        buttonComponent.setText("someText");

        Button buttonActual = buttonCreator.createWidget(buttonComponent, mContext);

        assertThat(buttonActual.getText(), is("someText"));
    }

}

但是在buttonActual.getText()中我有一个null。请帮助解决。

1 个答案:

答案 0 :(得分:0)

关于模拟的重要知识是,除非指定行为,否则它们永远不会充当原始对象。

在您的情况下:

“模拟”按钮将接收setText()的调用,但是由于它是一个模拟对象,因此它没有任何内部状态来存储文本字符串,因此它将正确返回null。 您可以指定行为以返回类似于以下内容的字符串:

when(mButton.getText()).thenReturn("mytext");

但这不是可选的,因为最后您要测试模拟框架的工作方式。

在这些情况下,应使用verify方法。每个模拟对象都会记录其生命周期内的所有方法调用。

verify(mButton, times(1)).setText("someText"));

通过此操作,您可以确保确切的方法调用正在发生。