我正在建立react-native app,里面有一些原生的android模块 在MainApplication.java中,
protected List<ReactPackage> getPackages() {
return Arrays.<ReactPackage>asList(
new VectorIconsPackage(),
new MyCustomPackage()
);
}
在我的MyCustomPackage中,
public class MyCustomPackage implements ReactPackage {
@Override
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
return Collections.emptyList();
}
@Override
public List<NativeModule> createNativeModules(
ReactApplicationContext reactContext) {
List<NativeModule> modules = new ArrayList<>();
modules.add(new MyCustomModule(reactContext));
return modules;
}
}
我有其他几个模块,但这只是一个例子。所有功能都运作良好。现在我想将单元测试写入MyCustomModule java类中的方法。我尝试使用Robolectric框架,但不知道它是如何使用反应原生的。还有其他工具吗?任何人都可以给我一些示例或指导编写单元测试反应本机原生android代码吗?
答案 0 :(得分:0)
使用Robolectric 4。
查看我的评论。
我的方式是
@Config和自定义应用程序材料可能是必需的 删除robolectric无法处理的二进制依赖项,例如Bugsnag和常规的soloader。如果您所有的依赖项都可用于您的开发环境系统架构(这是极不可能的),那么也许可以工作。
@RunWith(AndroidJUnit4.class)
@Config(
application = TestApplication.class
)
public class ReactModuleSpec {
private ReactModule reactModule;
@Before
public void beforeEach() {
// Retrieve application context.
Context applicationContext = ApplicationProvider.getApplicationContext();
// Recreate ReactApplicationContext which ReactModule depends upon.
// ReactApplicationContext sole purpose as documented in its source code
// is to preserve type integrity of ApplicationContext over Context
// (which android Context obviously does not). This should be safe
// thus. See my post here:
// `https://stackoverflow.com/questions/49962298/writing-unit-test-for-react-native-native-android-methods`.
ReactApplicationContext reactApplicationContext = new ReactApplicationContext(applicationContext);
// Instantiate the module.
reactModule = new ReactModule(reactApplicationContext);
}
// ...
}
public class TestApplication extends Application implements ReactApplication {
// ...
// Remove packages incompatible with Robolectric.
@Override
protected List<ReactPackage> getPackages() {
List<ReactPackage> packages = new PackageList(this).getPackages();
// ... Your standard stuffs
packages.removeIf(pkg -> pkg.getClass().isInstance(BugsnagReactNative.getPackage().getClass()));
return packages;
}
// Remove soloader !
@Override
public void onCreate() {
super.onCreate();
// Bye bye!
// BugsnagReactNative.start(this);
// SoLoader.init(this, /* native exopackage */ false);
}
}