我有一些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。请帮助解决。
答案 0 :(得分:0)
关于模拟的重要知识是,除非指定行为,否则它们永远不会充当原始对象。
在您的情况下:
“模拟”按钮将接收setText()的调用,但是由于它是一个模拟对象,因此它没有任何内部状态来存储文本字符串,因此它将正确返回null。 您可以指定行为以返回类似于以下内容的字符串:
when(mButton.getText()).thenReturn("mytext");
但这不是可选的,因为最后您要测试模拟框架的工作方式。
在这些情况下,应使用verify方法。每个模拟对象都会记录其生命周期内的所有方法调用。
verify(mButton, times(1)).setText("someText"));
通过此操作,您可以确保确切的方法调用正在发生。