我在单元测试中使用RoboGuice和AndroidMock框架时遇到问题.我已经创建了一个简单的项目来显示我的问题.在这里,我创建一个模拟实例并在RoboGuice中注册它.但是该过程在"setUp()"和"test01()"方法之间崩溃.正如我猜的那样,实际上当创建Injector时进程崩溃,如果任何模块内部有一个模拟实例.
如果我用实现接口的类的实例替换模拟的实例,那么一切正常.
有人知道如何解决这个问题吗?
这是我的测试代码:
public class testInjectMock extends RoboUnitTestCase<MyApplication> {
protected void setUp() throws Exception {
InterfaceToMock instance = AndroidMock.createNiceMock(InterfaceToMock.class); AndroidMock.expect(instance.SimpleMethod()).andStubReturn("Hello!");
MyModule myMockModule = new MyModule();
myMockModule.setMockedInstance(instance);//Comment this string to get into the test01() method
MyApplication.setMyModule(myMockModule);
super.setUp();
}
public void test01() {
//It never comes here
}
}
Run Code Online (Sandbox Code Playgroud)
模块源代码:
public class MyModule extends AbstractAndroidModule {
protected InterfaceToMock mockedInstance;
public void setMockedInstance(InterfaceToMock mockedInstance) {
this.mockedInstance = mockedInstance;
}
@Override
protected void configure() {
if(mockedInstance != null)
bind(InterfaceToMock.class).toInstance(mockedInstance);
}
}
Run Code Online (Sandbox Code Playgroud)
logcat输出:
05-23 …
Run Code Online (Sandbox Code Playgroud) 我正在使用Robolectric来测试Android.我正在通过maven运行我的测试,例如
mvn -Dtest=LogTest test
Run Code Online (Sandbox Code Playgroud)
如果我有代码写入日志,例如
Log.d("TAG", "blah");
Run Code Online (Sandbox Code Playgroud)
或者使用Roboguice的 Ln
Ln.d("blah");
Run Code Online (Sandbox Code Playgroud)
我没有在maven的surefire日志(文本文件)中看到任何输出.
理想情况下,我实际上想要简单的日志语句转到控制台.我可以使用写入控制台System.out.println("blah")
,但当然我宁愿使用支持的日志API.
所以我的问题是,为什么我根本看不到日志输出,如何将日志消息写入控制台?
我正在开发一个Android项目,我想知道关于什么是构建Android应用程序的好架构的任何建议.
我想使用Roboguice使用依赖注入,我一直在阅读MVVM模式或MVC模式(Android MVVM设计模式示例).
另外我知道roboguice有一个非常酷的基于上下文的事件的提升和处理功能,可以在代码解耦时非常可测试.
关于工作设计模式的任何建议?您已经合作或开发过的可测试且可扩展的架构?
我有很多类使用像@Singleton这样的注释
@Singleton
public class ImageCache
Run Code Online (Sandbox Code Playgroud)
我想保留.如何配置proguard -keep语句,使其适用于具有该注释的所有类.
顺便说一下上下文我在Android上使用Roboguice的应用需要这个,这就是我添加标签的原因.可能会帮助别人.
我在一个非常复杂且具有很多业务逻辑的android项目中使用guice进行辩论.Guice似乎很合适,但每当我开始深入阅读它时,它开始看起来比它需要的更复杂.
我不明白的一件事是:如果Guice是如此伟大并且是编写java代码的最佳方式,那么为什么使用Guice的Android代码如此之少......为什么Google没有在内部使用guice来安装Android?
我有一个片段,我需要在屏幕上显示.我希望能够InjectView
用来注入我的UI元素.InjectView在活动中工作正常,因为视图(xml)是在设置期间设置的onCreate
,但是在片段上设置了视图onCreatView
.
那么有没有办法在片段上使用InjectView?我知道我可以使用findViewbyId来查找每个元素,但我更喜欢使用InjectView
public class ProfileFragment extends RoboDialogFragment {
@InjectView(R.id.commentEditText)
protected EditText commentEditText;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// I get a null pointer exception here
commentEditText.setText("Some comment");
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.profile , container, false);
// I get a null pointer exception here
commentEditText.setText("Some comment");
return view;
}
}
Run Code Online (Sandbox Code Playgroud) 我正在开发和Android倒计时应用程序.
在应用程序中,您可以根据需要添加或删除多个倒计时.
所有倒计时都保存在ArrayList中.我不能将它们保存在数据库或共享首选项中,因为即使您离开应用程序,倒计时也必须继续运行.
我正在使用roboguice 2.0和guice-3.0-no_aop.jar来处理我的依赖注入.
大多数时候everthing工作正常,但有时如果我启动应用程序我只得到以下警告和所有变量,如我保存倒计时的Arraylist再次是空的.
05-21 13:07:33.260: W/nalizableReferenceQueue(14417): Could not load Finalizer in its own class loader. Loading Finalizer in the current class loader instead. As a result, you will not be able to garbage collect this class loader. To support reclaiming this class loader, either resolve the underlying issue, or move Google Collections to your system class path.
05-21 13:07:33.260: W/nalizableReferenceQueue(14417): java.io.FileNotFoundException: com/google/inject/internal/util/$Finalizer.class
05-21 13:07:33.260: W/nalizableReferenceQueue(14417): at com.google.inject.internal.util.$FinalizableReferenceQueue$DecoupledLoader.getBaseUrl(FinalizableReferenceQueue.java:269)
05-21 13:07:33.260: W/nalizableReferenceQueue(14417): at com.google.inject.internal.util.$FinalizableReferenceQueue$DecoupledLoader.loadFinalizer(FinalizableReferenceQueue.java:253)
05-21 13:07:33.260: W/nalizableReferenceQueue(14417): at com.google.inject.internal.util.$FinalizableReferenceQueue.loadFinalizer(FinalizableReferenceQueue.java:175) …
Run Code Online (Sandbox Code Playgroud) 我在找到使用片段+ RoboGuice的工作示例时遇到了问题.当您尝试使用Android片段事务管理器添加/删除片段时,会发生此问题.一旦告诉片段继承自RoboFragment,事务管理器就不再认为该类是片段(因为它扩展了RoboFragment).但是,您可以使用RoboGuice自己的片段管理器,但它也会崩溃.有没有动态添加/删除RoboGuice片段的例子?
有没有人知道如何使用Guice将依赖项注入到Android中的Activity的构造函数中?看起来活动通常只有默认构造函数,以便平台可以轻松创建新实例.虽然很容易有一个单例来引用注入器并以这种方式获得依赖关系,但它不那么干净并且引入了一些静态状态.
有什么建议?