我有一个用Kotlin写的片段。我使用导入布局视图
import kotlinx.android.synthetic.main.my_fragment_layout.在我的一个方法中,我设置了TextView的文本:
fun setViews() {
myTextView.text = "Hello"
// In Java I would have used:
// (getView().findViewById(R.id.myTextView)).setText("Hello");
}在我的普通JVM单元测试中,我想使用Mockito测试这个方法。例如,如果上面的方法是用java编写的,我可以这样做:
public void setViewsTest() {
// Mock dependencies
View view = Mockito.mock(View.class);
TextView myTextView = Mockito.mock(TextView.class);
when(fragment.getView()).thenReturn(view);
when(view.findViewById(R.id. myTextView)).thenReturn(myTextView);
// Call method
fragment.setViews();
// Verify the test
verify(myTextView).setText("Hello");
}在使用Kotlin的kotlinx.android.synthetic视图时,我如何实现类似的实现?
发布于 2017-10-27 00:37:02
我认为对于这种类型的测试,Robolectric是一个更合适的工具。使用它,您可以更轻松地在JVM上测试具有Android依赖项的代码。
例如,您的测试将如下所示:
@Test
fun `should set hello`() {
val fragment = YourFragment()
fragment.setViews()
assertEquals(fragment.myTextView.getText().toString(), "Hello");
}发布于 2018-08-02 17:21:17
我也一直在寻找这个问题的解决方案,这就是我目前正在做的模拟视图,以便能够验证它们。
这个解决方案不使用kotlinx.android.synthetic,因为我还没有找到避免“方法未被模仿”异常的方法,而是使用Butterknife方法。
在活动或片段中:
@BindView(R.id.my_text_view)
internal lateinit var myTextView: TextView
// ...
fun setViews() {
myTextView.text = "Hello"
}在测试中:
import com.nhaarman.mockito_kotlin.mock
class MyActivityTest {
private val underTest = MyActivity()
@Before
fun setUp() {
underTest.myTextView = mock()
}
@Test
fun setViews() {
underTest.setViews()
verify(underTest.myTextView).text = "Hello"
}
}发布于 2018-09-12 20:05:14
我也有同样的问题。
发现Kotlin extension为视图/片段添加了一些功能。假设-我有Fragment - SampleFragment,其中onViewCreated()我在膨胀后访问一些视图:
override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
with(webView) {
webViewClient = createWebClient()
}
}当然,我对webViewClient = createWebClient()的单元测试失败了
那么,让我们看看kotlin扩展添加到了我的片段中(转到Tools-> Kotlin ->Show Kotlin Byte Code,然后选择反编译)。
public final class SampleFragment extends Fragment {
...
private HashMap _$_findViewCache;
public View _$_findCachedViewById(int var1) {
if (this._$_findViewCache == null) {
this._$_findViewCache = new HashMap();
}
View var2 = (View)this._$_findViewCache.get(var1);
if (var2 == null) {
View var10000 = this.getView();
if (var10000 == null) {
return null;
}
var2 = var10000.findViewById(var1);
this._$_findViewCache.put(var1, var2);
}
return var2;
}现在,我们有了存储所有ids的HashMap ->Views键值对。有两种可能的解决方案: 1.窥探你的对象并返回正确的视图:
@Mock lateinit var view: View
@Mock lateinit var webView: WebView
@Before
fun setUp() {
sampleFragment = spy(SampleFragment())
doReturn(view).`when`(sampleFragment).view
doReturn(webView).`when`(view).findViewById<WebView>(R.id.webView)
}var hashMap = java.util.HashMap() hashMap.put(R.id.webView,webView) Whitebox.setInternalState(sampleFragment,"_\$_findViewCache",hashMap)
也许有另一种更特定于Kotlin的方法来避免这个问题?
https://stackoverflow.com/questions/46955978
复制相似问题