我正在尝试用Mockito和Dagger测试一项活动 .我已经能够在我的应用程序中为Activity注入依赖项,但在测试Activity时,我无法向Activity注入mock.我应该注入Activity来测试还是让getActivity()创建它?
public class MainActivityTest extends
ActivityInstrumentationTestCase2<MainActivity> {
@Inject Engine engineMock;
private MainActivity mActivity;
private Button mLogoutBtn;
public MainActivityTest() {
super(MainActivity.class);
}
@Override
protected void setUp() throws Exception {
super.setUp();
// Inject engineMock to test
ObjectGraph.create(new TestModule()).inject(this);
}
@Override
protected void tearDown() {
if (mActivity != null)
mActivity.finish();
}
@Module(
includes = MainModule.class,
entryPoints = MainActivityTest.class,
overrides = true
)
static class TestModule {
@Provides
@Singleton
Engine provideEngine() {
return mock(Engine.class);
}
}
@UiThreadTest
public void testLogoutButton() { …Run Code Online (Sandbox Code Playgroud) android dependency-injection functional-testing mockito dagger
我目前正在尝试将Dagger 2集成到Android应用程序中.我的项目设置如下:
在我的库项目中,我定义了一个类,我稍后将其注入到库中的其他需要它的类(活动和常规类)以及应用程序项目中.
@Singleton
public class MyManager{
@Inject
public MyManager(){
//Do some initializing
}
}
Run Code Online (Sandbox Code Playgroud)
现在 - 例如在我的片段或活动或常规类中,我将按如下方式注入上述Singleton:
public class SomeClass{
@Inject
MyManager myManager;
}
Run Code Online (Sandbox Code Playgroud)
或者我想,因为在实践中,myManager总是为空.显然它的构造函数从未被调用过,所以我想我必须错过配置方面的东西?或者我可能误解了文档,但这并不意味着以这种方式工作?MyManager类的目的是成为应用程序范围内可访问的组件累积实体 - 这就是我选择@Singleton的原因.
UPDATE
为了避免混淆:我在评论中提到了我的组件,我认为 - 这是指"基于组件的设计"意义上的组件,与匕首无关.我上面列出了基于匕首的代码 - 我的代码中没有任何与dagger相关的代码.
当我开始添加@Component时,我遇到了一些编译器问题,因为我的dagger2设置不正确 - 请查看这个关于如何正确设置dagger2的真正有用的线程:https://stackoverflow.com/a/29943394/1041533
更新2
这是我更新的代码,基于G. Lombard的建议 - 我更改了代码如下 - 原始的Singleton在库项目中:
@Singleton
public class MyManager{
@Inject
public MyManager(){
//Do some initializing
}
}
Run Code Online (Sandbox Code Playgroud)
库项目中还有bootstrap类:
@Singleton
@Component
public interface Bootstrap {
void initialize(Activity activity);
}
Run Code Online (Sandbox Code Playgroud)
然后我在我的活动中使用上面的Bootstrap类(在我的具体应用程序中,而不是在库项目中!但是我在库中也有访问Bootstrap以注入MyManager的类/活动):
public class MyActivity extends Activity{
@Inject …Run Code Online (Sandbox Code Playgroud) 我试图在Dagger2中做SubScoping.但是,我无法弄清楚这个编译错误: - > ...MyApplicationModule must be set发生在我的LogInFragment.如果有人试图对这个错误有所了解.我真的很高兴.
这是MyApplication类:
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
MyInjector.initialize(this);
}
}
Run Code Online (Sandbox Code Playgroud)
这是MyInjector类:
public enum MyInjector {
INSTANCE;
MyApplicationComponent myApplicationComponent;
private MyInjector() {
}
public static void initialize(MyApplication myApplication) {
MyApplicationComponent myApplicationComponent = DaggerMyApplicationComponent.builder()
.myApplicationModule(new MyApplicationModule(myApplication))
.build();
INSTANCE.myApplicationComponent = myApplicationComponent;
}
public static MyApplicationComponent get() {
return INSTANCE.myApplicationComponent;
}
}
Run Code Online (Sandbox Code Playgroud)
这是MyApplicationComponent类:
@Component (modules = {MyApplicationModule.class})
public interface MyApplicationComponent {
}
Run Code Online (Sandbox Code Playgroud)
这是MyApplicationModule类 …
将android studio更新为0.4.0并将gradle插件更新为0.7.1并使用dagger编译器将gradle版本更新为1.9后出现奇怪问题
的build.gradle
android {
packagingOptions {
exclude 'META-INF/DEPENDENCIES.txt'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt'
}
}
dependencies {
compile 'com.android.support:support-v4:+'
compile 'com.android.support:support-v13:19.0.+'
compile 'com.google.code.gson:gson:2.2.4'
compile 'com.squareup.dagger:dagger:1.2.0'
compile 'com.squareup.dagger:dagger-compiler:1.2.0'
}
Run Code Online (Sandbox Code Playgroud)
在构建中收到此错误
Execution failed for task ':MyApplication:packageDebug'.
Run Code Online (Sandbox Code Playgroud)
在APK META-INF/services/javax.annotation.processing.Processor中复制的重复文件文件1:C:\ Users\Mantas.gradle\caches\modules-2\files-2.1\com.squareup.dagger\dagger-compiler\1.2.0\22633bb84433e03d345a83e7b0c08c66768be30\dagger-compiler-1.2.0.jar文件2:C:\ Users\Mantas.gradle\caches\modules-2\files-2.1\com.squareup.dagger\dagger-compiler\1.2.0\22633bb84433e03d345a83e7b0c08c66768be30 \匕首编译-1.2.0.jar
如果匕首编译器行被评论一切正常
我怎么解决这个问题?谢谢
EDITED 固定的问题,检查 https://plus.google.com/+HugoVisser/posts/7Wr3FcdNVxR
我想尝试新的东西并使用Dagger 2作为我的DI框架.所以我在我的项目中有以下pom和"hello world"咖啡机类(http://google.github.io/dagger/).
但是当我做一个mvn干净安装时,没有生成任何类.据我所知,应该有一个"Dagger_CoffeeShop"类生成.嗯......我错过了什么?
<modelVersion>4.0.0</modelVersion>
<groupId>kic</groupId>
<artifactId>xfoo</artifactId>
<version>0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>com.google.dagger</groupId>
<artifactId>dagger</artifactId>
<version>2.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<dependencies>
<dependency>
<groupId>com.google.dagger</groupId>
<artifactId>dagger-compiler</artifactId>
<version>2.0-SNAPSHOT</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
Run Code Online (Sandbox Code Playgroud) 在这个问题中我谈到了Dagger2.Dagger2基本上由组件和模块组成.这是一个例子:
假设我有一个界面:
public interface MyCoolService {
void run();
}
Run Code Online (Sandbox Code Playgroud)
以及可能的实施:
public class MyCoolServiceImpl {
@Override
void run() {}
}
Run Code Online (Sandbox Code Playgroud)
我可以使用Dagger2生成链接实现与接口:
@Component(modules = {MyModule.class})
@Singleton
public interface Component {
MyCoolService getMyCoolService();
}
Run Code Online (Sandbox Code Playgroud)
和
@Module
public class MyModule {
@Provides @Singleton
MyCoolService provideMyCoolService() {
return new MyCoolServiceImpl();
}
}
Run Code Online (Sandbox Code Playgroud)
这是Dagger2的简要介绍.现在假设我有以下界面:
public interface MySecondCoolService {
void doCoolStuff();
}
Run Code Online (Sandbox Code Playgroud)
没有执行MySecondCoolServiceImpl的MySecondCoolService代码.相反,我有一个标注@JustForCoolStuff字段和方法的注释.我创建了一个Annotation处理器,它收集所有这些Annotations并生成MySecondCoolServiceImpl哪些实现MySecondCoolService.
我是编译器MySecondCoolService在注释处理器运行之前知道新接口的.所以我可以将我的组件更改为:
@Component(modules = {MyModule.class})
@Singleton
public interface Component {
MyCoolService …Run Code Online (Sandbox Code Playgroud) 我刚刚开始学习dagger2,面对一个看起来像个bug的奇怪问题.这是模块:
@Module
public class SimpleModule {
@Provides
Cooker providerCooker() {
return new Cooker("tom", "natie");
}
}
Run Code Online (Sandbox Code Playgroud)
零件:
@Component(modules = SimpleModule.class)
public interface SimpleComponent {
void inject(DaggerTestActivity activity);
}
Run Code Online (Sandbox Code Playgroud)
接口:
public interface CoffeeMaker {
String makeCoffee();
}
Run Code Online (Sandbox Code Playgroud)
执行:
public class SimpleMaker implements CoffeeMaker {
Cooker mCooker;
@Inject
public SimpleMaker(Cooker cooker) {
this.mCooker = cooker;
}
@Override
public String makeCoffee() {
return mCooker.makeCoffee();
}
}
Run Code Online (Sandbox Code Playgroud)
电饭煲:
public class Cooker {
String name;
String coffeeKind;
public Cooker(String name, String coffeeKind) {
this.name = …Run Code Online (Sandbox Code Playgroud) 当我添加以下代码时出现错误:
@Singleton @Provides fun provideGson() : Gson {
return Gson()
}
Run Code Online (Sandbox Code Playgroud)
我真的不知道为什么.
有两个片段:ParentFragment和ChildFragment.
ChildFragment已被添加到视图中ParentFragment.
现在使用Dagger2Android有ParentFragmentModule一个方法:
@Provides
fun provideViewModel(fragment: ParentFragment, myViewModelFactory: MyViewModelFactory): MyViewModel {
return ViewModelProviders.of(fragment, myViewModelFactory).get(MyViewModelImpl::class.java)
}
Run Code Online (Sandbox Code Playgroud)
其中MyViewModelFactory,MyViewModel,MyViewModelImpl是在应用程序中创建的简单ViewModel逻辑.
并且ChildFragmentModule具有以下方法:
@Provides
fun provideViewModel(fragment: ChildFragment, myViewModelFactory: MyViewModelFactory): MyViewModel {
return ViewModelProviders.of(fragment, myViewModelFactory).get(MyViewModelImpl::class.java)
}
Run Code Online (Sandbox Code Playgroud)
这显然是创建两个单独的实例,ViewModel因为它们接收两个不同的片段实例.
我们如何使它返回相同的实例,以便可以在Parent和Child片段之间共享数据?
我试过传递ParentFragment而不是ChildFragment在ChildFragmentModule,但这导致Dagger依赖注入错误.
不确定为什么构建失败。一切似乎都在受控之中
\nclass MapObjectRepositoryIMPL @Inject constructor(\n @ApplicationContext context : Context,\n val mapObjectDao: MapObjectDao,\n val barrechatNetwork: BarreNetwork,\n @DefaultDispatcher private val defaultScope: CoroutineContext\n) : MapObjectRepository {\n\nRun Code Online (Sandbox Code Playgroud)\n@Module\n@InstallIn(ApplicationComponent::class)\nobject DispatcherModule {\n\n @DefaultDispatcher\n @Provides\n fun providesDefaultDispatcher(): CoroutineDispatcher = Dispatchers.Default\n\n @IoDispatcher\n @Provides\n fun providesIoDispatcher(): CoroutineDispatcher = Dispatchers.IO\n\n @MainDispatcher\n @Provides\n fun providesMainDispatcher(): CoroutineDispatcher = Dispatchers.Main\n}\n\n@Qualifier\n@Retention(AnnotationRetention.BINARY)\nannotation class IoDispatcher\n\n@Qualifier\n@Retention(AnnotationRetention.BINARY)\nannotation class MainDispatcher\n\n@Qualifier\n@Retention(AnnotationRetention.BINARY)\nannotation class DefaultDispatcher\nRun Code Online (Sandbox Code Playgroud)\n我收到的错误是这样的,但看起来我正确提供了所有内容,限定符和对存储库类的注入,这很奇怪......
\nANTLR Tool version 4.5.3 used for code generation does not match the current runtime version 4.7.1ANTLR Runtime version 4.5.3 used for parser …Run Code Online (Sandbox Code Playgroud)