我正在尝试使用Robolectric创建一个测试。我的目标是能够从自定义行为中替换一个类的功能(例如来自库且无法修改代码的类)。
我创建了这个小测试来模拟我想要做的事情:
@RunWith(RobolectricTestRunner.class)
@Config(shadows = {ShadowMessenger.class})
public class TestShadow {
@Test
public void testMessenger() {
OriginalMessenger messenger = new OriginalMessenger();
String message = messenger.getMessage();
Assert.assertEquals("Shadow messenger", message);
}
public static class OriginalMessenger {
public String getMessage() {
return "Original messenger";
}
}
@Implements(OriginalMessenger.class)
public static class ShadowMessenger extends OriginalMessenger {
@Implementation
public String getMessage() {
return "Shadow messenger";
}
}
}
在这个例子中,OriginalMessenger是库中提供默认功能的类。而ShadowMessenger是包含我想要应用于每次使用OriginalMessenger时的自定义行为的类。但是当我运行测试时,它失败了。 message的内容是"Original messenger",好像ShadowMessenger从未被使用过。
我做错了什么?
A
需要测试,它需要类B
才能正常工作。但是B
在库中,所以我不能修改或扩展它。我想测试A
,但是不想使用原始的B
,而是想使用一个虚拟的B
,同时又不改变A
的代码。这就是我认为可以使用 shadows 的原因。我的想法是:每当代码需要B
时,就使用虚拟的B
替代它。其中一种可能的解决方案是使用依赖注入,在其中将B
(或虚拟的B
)注入到A
中进行使用。但我想知道是否可以使用 shadows 实现此功能。 - Mauricio Togneri