我希望这只是我在这里做错的事情。我试图使用Dagger 2.0为我的JUnit测试注入依赖项(不是Espresso测试,只是纯JUnit)。所以,我有一个主要的' java模块和'测试' java模块。在主模块中,我有一个Dagger模块和一个组件:
@Module
public class MainModule {
@Provides
public Widget provideWidget() {
return new ConcreteWidget();
}
}
...
@Component (modules = MainModule.class)
public interface MainComponent {
void inject(WidgetConsumer consumer);
}
在我的测试模块中,我有以下内容:
@Module
public class TestModule {
@Provides public Widget provideWidget() {
return new Widget() {
@Override
public void doThing() {
int y = 6;
y ++;
}
};
}
}
...
@Component(modules = TestModule.class)
public interface TestComponent extends MainComponent{
}
我的build.gradle有依赖关系,如下所示:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.2.0'
testCompile 'junit:junit:4.12'
compile 'com.google.dagger:dagger:2.9'
testCompile 'com.google.dagger:dagger:2.9'
annotationProcessor 'com.google.dagger:dagger-compiler:2.9'
testAnnotationProcessor 'com.google.dagger:dagger-compiler:2.9'
}
无论出于何种原因,Dagger会生成DaggerMainComponent
,但拒绝生成DaggerTestComponent
。我构建时,gradle输出中似乎没有错误。
这就是......我认为注释处理器正在运行,但不知何故,android gradle插件无法在编译时拉入这些生成的源。我已经检查了app / build / generated / source / apt / test /目录,并在那里找到了DaggerTestComponent.java
,但出于某种原因,它并未作为依赖项导入。
答案 0 :(得分:18)
在build.gradle
DSL:
android
android {
...
}
android.applicationVariants.all {
def aptOutputDir = new File(buildDir, "generated/source/apt/${it.unitTestVariant.dirName}")
it.unitTestVariant.addJavaSourceFoldersToModel(aptOutputDir)
}
此后,您的测试组件将被识别。
对于Kotlin,将generated/source/apt/...
替换为generated/source/kapt/...
跟踪器中有an issue raised。
答案 1 :(得分:5)
我找到了一个解决方法,以防将来有人遇到这个问题。看来android gradle插件中的testAnnotationProcessor
命令对测试模块不起作用(可能是它们实现中的一个错误?)。所以你可以编写testAnnotationProcessor
,你的build.gradle会编译,但似乎无法正常工作。
解决方法是回归到Hugo Visser(android-apt)旧的第三方注释处理插件。
为此,请将以下内容添加到主build.gradle中的buildscript依赖项中:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.0-rc1'
// ADD THIS LINE HERE vvv
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}
}
然后,在您单个模块的build.gradle中,在顶部添加以下行:
apply plugin: 'com.android.library'
// ADD THIS LINE HERE vvv
apply plugin: 'com.neenbedankt.android-apt'
最后,不要使用testAnnotationProcessor
和annotationProcessor
,而只需使用apt
和testApt
:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.2.0'
compile 'com.google.dagger:dagger:2.9'
// USE apt INSTEAD OF annotationProcessor HERE vvv
apt 'com.google.dagger:dagger-compiler:2.9'
testCompile 'com.google.dagger:dagger:2.9'
// USE testApt INSTEAD OF testAnnotationProcessor HERE vvv
testApt 'com.google.dagger:dagger-compiler:2.9'
testCompile 'junit:junit:4.12'
}
请注意,您必须使用1.8版本的android-apt,因为1.4版本不附带testApt
命令/ function / whatever。
答案 2 :(得分:0)
取决于您的测试类型:
testAnnotationProcessor "com.google.dagger:dagger-compiler:2.x"
src/test
或
androidTestAnnotationProcessor "com.google.dagger:dagger-compiler:2.x"
src/androidTest