### Question:
Startup extends ProduceableSubject<StartupInfo> implements Install<StartupConfig> { @Override public void produce(StartupInfo data) { if (mConfig == null) { L.d("Startup is not installed, produce data fail."); return; } super.produce(data); }  @Override synchronized boolean install(StartupConfig config); @Override synchronized void uninstall(); @Override synchronized boolean isInstalled(); @Override StartupConfig config(); @Override void produce(StartupInfo data);  }### Answer:
@Test public void work() { try { GodEye.instance().<Startup>getModule(GodEye.ModuleName.STARTUP).produce(new StartupInfo(StartupInfo.StartUpType.COLD, 1)); GodEye.instance().<Startup>getModule(GodEye.ModuleName.STARTUP).produce(new StartupInfo(StartupInfo.StartUpType.HOT, 2)); TestObserver<StartupInfo> testObserver = GodEye.instance().<Startup, StartupInfo>moduleObservable(GodEye.ModuleName.STARTUP).test(); GodEye.instance().<Startup>getModule(GodEye.ModuleName.STARTUP).produce(new StartupInfo(StartupInfo.StartUpType.COLD, 3)); GodEye.instance().<Startup>getModule(GodEye.ModuleName.STARTUP).produce(new StartupInfo(StartupInfo.StartUpType.HOT, 4)); testObserver.assertValueCount(3).assertValueAt(0, new Predicate<StartupInfo>() { @Override public boolean test(StartupInfo info) throws Exception { Log4Test.d(info); return StartupInfo.StartUpType.HOT.equals(info.startupType) && info.startupTime == 2; } }).assertValueAt(1, new Predicate<StartupInfo>() { @Override public boolean test(StartupInfo info) throws Exception { Log4Test.d(info); return StartupInfo.StartUpType.COLD.equals(info.startupType) && info.startupTime == 3; } }).assertValueAt(2, new Predicate<StartupInfo>() { @Override public boolean test(StartupInfo info) throws Exception { Log4Test.d(info); return StartupInfo.StartUpType.HOT.equals(info.startupType) && info.startupTime == 4; } }); } catch (UninstallException e) { Assert.fail(); } }