我有一个用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
观看时如何进行类似的实施?
答案 0 :(得分:0)
我认为Robolectric对于此类测试来说是更合适的工具。使用它,您可以更轻松地在JVM上使用Android依赖项测试代码。
例如,您的测试看起来像这样:
@Test
fun `should set hello`() {
val fragment = YourFragment()
fragment.setViews()
assertEquals(fragment.myTextView.getText().toString(), "Hello");
}
答案 1 :(得分:0)
我也一直在寻找解决方案,这就是我目前正在做的工作,以模拟视图以验证它们。
此解决方案不不使用kotlinx.android.synthetic
,因为我还没有找到避免“ Method not嘲笑的方法”异常的方法,而是使用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"
}
}
答案 2 :(得分:0)
我遇到了同样的问题。
发现Kotlin extension为视图/片段添加了一些功能。 假设-我有Fragment-SampleFragment,其中onViewCreated()在膨胀后我正在访问一些视图:
override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
with(webView) {
webViewClient = createWebClient()
}
}
当然我的单元测试在webViewClient = createWebClient()上失败了
所以,让我们看看我的片段中添加了什么kotlin扩展(转到“工具”->“ Kotlin”->“显示Kotlin字节码,然后选择反编译”)。
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;
}
现在,我们有了HashMap,用于存储所有ids-> 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)
}
使用反射(模拟白盒)初始化_ $ _ findViewCache HashMap。
var hashMap = java.util.HashMap() hashMap.put(R.id.webView,webView) Whitebox.setInternalState(sampleFragment,“ _ \ $ _ findViewCache”,hashMap)
也许还有另一种Kotlin特有的方法来避免此问题?