据我所知,在
measure(0, 0)
上调用 TextView
会导致视图将其测量的宽度和高度设置为当前字体/文本大小所需的最小值:
public class TextViewSizeTest extends AndroidTestCase {
public void testTextWidth() {
TextView view = new TextView(getContext());
view.setTextSize(42);
view.setText("test");
view.measure(0, 0);
assertEquals(212, view.getMeasuredWidth());
}
}
神奇数字 212 是正确答案 - 测试通过。
但是 Android 单元测试并不是很快 - 所以我尝试使用 Robolectric。
@RunWith(RobolectricTestRunner.class)
public class TextViewSizeTest {
@Test
public void testTextWidth() {
TextView view = new TextView(Robolectric.application);
view.setTextSize(42);
view.setText("test");
view.measure(0, 0);
assertThat(view.getMeasuredWidth(), equalTo(212));
}
}
现在这个测试失败了:
java.lang.AssertionError:
Expected: <212>
but: was <0>
所以问题是 - 我是否在测试设置/初始化中遗漏了某些内容,或者 Robolectric 中确实存在问题,无法正确测量 TextView 大小?
正确的答案是它没有在 Robolectric 中实现。然而。唯一相关的函数是
Paint
的 measureText
,它仅返回文本长度。看来我必须为此自己扩展 Robolectric。
我知道已经过去很多年了,但 Robolectric 的默认行为并没有改变。 但是,有一种本机图形模式,在这些情况下可能效果更好。 将其添加到您的测试方法中:
@Test
@GraphicsMode(GraphicsMode.Mode.NATIVE)