【发布时间】:2017-07-13 11:53:44
【问题描述】:
我想使用 PowerMock 覆盖包保护类中的一个方法,以进行我在 Android 项目上进行的一些测试。我相信这是执行此操作的正确方法,以便我可以代理我想代理调用的方法。
我的测试位于被测代码所在的包之外。
给定类:FooBar
package com.foo.bar
Class FooBar extends Object {
private void updateSomething(int Param1, String param2 ){
//Do some work....
}
}
我想要一个模拟的测试用例,以便我可以代理 updateSomething 方法。
我设想过这样的事情:
package com.example.test
@RunWith(PowerMockRunner.class)
public class TestClass {
@PrepareForTest({com.foo.bar.FooBar.class}) //<---COMPLAINT IS HERE
public void test001_doTest() {
}
}
这里的问题是 IDE 抱怨 FooBar 类不是公共的。
Error:(209, 55) error: FooBar is not public in com.foo.bar; cannot be accessed from outside package.
我认为 PowerMock 能够免费克服这个问题。 任何建议将不胜感激。
顺便说一句:我意识到我可以在这里使用反射。但是在频繁调用此方法的情况下,我可能会设置测试,然后通过其他方式更改我通过模拟设置的值,从而导致测试错误地(并且间歇性地)失败。在这种情况下,我认为代理类和方法会更好。据说这就是 Mockito 和 PowerMock 的亮点?
【问题讨论】:
-
如果您在测试代码中使用
FooBar,那么代码必须在同一个包中。那么为什么要测试这段代码在不同的包中呢? -
@MariuszMączkowski,被测代码作为 Java 库 (SDK) 交付并在测试应用程序中使用。这不是单元测试,而是更多的 SDK 测试,我们在更高级别测试功能,但仍需要控制内部依赖关系。
-
如果您必须使用在此库中关闭的隔离部件来测试库,这很奇怪。你有编译器错误。我认为唯一的方法是使用反射和修改类访问修饰符。
-
@MariuszMączkowski,我同意你的 cmets。我可能不得不倾向于反射方法。或者只是重命名我的测试包以匹配被集成到被测应用程序中的 SDK。后者没试过……
-
能否请您详细说明:此方法不是静态的。那么您打算如何将 Foo 类的 mocked 对象传递到您的测试类中 - 考虑到 Foo 不可用的事实?换句话说:请向我们展示您的测试方法在做什么。
标签: java android unit-testing mockito powermock