Java 机器人阴影不工作

Java 机器人阴影不工作,java,android,shadow,robolectric,Java,Android,Shadow,Robolectric,我正在尝试使用Robolectric创建一个测试。我的目标是能够从自定义行为中替换一个类的功能(例如来自库,我不能修改代码) 我创建了这个小测试来模拟我想要做的事情: @RunWith(RobolectrictTestRunner.class) @配置(shadows={ShadowMessenger.class}) 公共类TestShadow{ @试验 public void testMessenger(){ OriginalMessenger=新的OriginalMessenger(); 字

我正在尝试使用Robolectric创建一个测试。我的目标是能够从自定义行为中替换一个类的功能(例如来自库,我不能修改代码)

我创建了这个小测试来模拟我想要做的事情:

@RunWith(RobolectrictTestRunner.class)
@配置(shadows={ShadowMessenger.class})
公共类TestShadow{
@试验
public void testMessenger(){
OriginalMessenger=新的OriginalMessenger();
字符串消息=messenger.getMessage();
Assert.assertEquals(“影子使者”,消息);
}
公共静态类OriginalMessenger{
公共字符串getMessage(){
返回“原始信使”;
}
}
@实现(OriginalMessenger.class)
公共静态类ShadowMessenger扩展了OriginalMessenger{
@实施
公共字符串getMessage(){
返回“影子使者”;
}
}
}
在本例中,OriginalMessenger是库中的类,提供默认功能。ShadowMessenger是一个包含自定义行为的类,每当我使用OriginalMessenger时,我都要应用这些自定义行为

但是,当我运行测试时,它失败了。信息内容为“原始信使”。好像暗影使者从未被使用过


我做错了什么?

你只能对android类进行阴影处理。但是使用自定义的机器人测试运行器,您也可以对自己的类进行阴影处理

Robolectric 3.1.4(RobolectricGradleTestRunner已完全删除,所以您需要覆盖RobolectricTestRunner中描述的方法)

机器人分子3.0

@Override
public InstrumentationConfiguration createClassLoaderConfig() {
    InstrumentationConfiguration.Builder builder = InstrumentationConfiguration.newBuilder();
    builder.addInstrumentedClass(OriginalMessenger.class.getName());
    return builder.build();
}
机器人分子2.4

@Override
protected ClassLoader createRobolectricClassLoader(Setup setup, SdkConfig sdkConfig) {
    return super.createRobolectricClassLoader(new ExtraShadows(setup), sdkConfig);
}

class ExtraShadows extends Setup {
    private Setup setup;

    public ExtraShadows(Setup setup) {
        this.setup = setup;
    }

    public boolean shouldInstrument(ClassInfo classInfo) {
        boolean shoudInstrument = setup.shouldInstrument(classInfo);
        return shoudInstrument
                || classInfo.getName().equals(OriginalMessenger.class.getName());
    }
}

示例项目

为什么要制作阴影?为什么不
mock
stub
解决它?我如何使用mock和stub实现相同的结果?哦,我看到nenick解决了你的问题?您可以使用EasyMock/PowerMock模拟您的类或Spock(Robospock)。看看这里的一个例子:。如果我应用nenick的答案,我会得到一个StackOverflower错误,我不知道为什么。我不能用PowerMock运行它。我得到:
扩展API内部错误:org.powermock.API.Extension.proxyframework.proxyframeworkmpl在类路径中找不到
。我从示例中获取依赖项。谢谢你的帮助。你在使用“testCompile”吗?你设置注释了吗?很好!我不知道如果我这样做我会得到一个StackOverflower错误。你知道为什么会这样吗?不是没有看到stacktrace。哪种方法称为循环?这是堆栈跟踪:这是我正在使用的类:Hi@nenick,robolectric 3.0怎么样。我可以在此版本中找到字节码.Setup类。
@Override
protected ClassLoader createRobolectricClassLoader(Setup setup, SdkConfig sdkConfig) {
    return super.createRobolectricClassLoader(new ExtraShadows(setup), sdkConfig);
}

class ExtraShadows extends Setup {
    private Setup setup;

    public ExtraShadows(Setup setup) {
        this.setup = setup;
    }

    public boolean shouldInstrument(ClassInfo classInfo) {
        boolean shoudInstrument = setup.shouldInstrument(classInfo);
        return shoudInstrument
                || classInfo.getName().equals(OriginalMessenger.class.getName());
    }
}