我正在深入了解Espresso' IdlingResource concept,目前我对在生产代码中使用IdlingResource
的选项感到不满。我知道有一个article显示了我如何通过各种方式解决这个问题或使用像Dagger2或AspectJ等的DI,但我彻底考虑了这些变体并驳回了它们。 (这是我的动机,请不要讨论决定)
在我的代码中获得IdleResource
而不会混淆太多职责的最佳解决方案是创建一个具有两个不同实现的虚拟类UILock
(不是接口),一个在生产代码中,一个在测试中。
刺激src/main/java...
package my.application.something;
import android.util.Log;
public class UILock
{
public static void Lock()
{
Log.i("REAL", "REAL");
}
public static void Unlock()
{
Log.i("REAL", "REAL");
}
}
测试一src/androidTest/java...
package my.application.something;
import android.support.test.espresso.IdlingResource;
import android.support.test.espresso.idling.CountingIdlingResource;
import android.util.Log;
public class UILock
{
private static CountingIdlingResource con = new CountingIdlingResource("RES");
public static void Lock()
{
con.increment();
Log.i("MOCK", "MOCK");
}
public static void Unlock()
{
con.decrement();
Log.i("MOCK", "MOCK");
}
public static IdlingResource GetIdle()
{
return con;
}
}
这实际上做的是在这里创建一些编译时多态。
在我的测试中,我写了类似
的内容Espresso.registerIdlingResources( UILock.GetIdle());
并且它有效,因为debug
变体已实现GetIdle
方法。
这个概念实际上工作正常,调试配置编译得很好,测试运行等,但有一个问题:Android Studio标记GetIdle
方法有错误"无法解决方法"。这在技术上是错误的恕我直言。我的构建变量设置为debug,以便实际存在此方法。
有没有办法解决这个问题?我可以抑制生成的伪错误吗?我显然无法在UILock
的生产变体中公开此方法,因为它返回的IdlingResource
未编译到生产中(这就是整个目的)。