【发布时间】:2014-08-18 20:17:59
【问题描述】:
我使用 JUnit4 和 Mockito 进行单元测试,现在我正在尝试将 PowerMock 添加到我的工具箱中。 我马上就面临着 PowerMock 的一个奇怪的类加载行为。所以,我使用了一些这样的代码:
@PrepareForTest(ClassToMock.class)
public class MyTest
{
@Rule
public PowerMockRule rule = new PowerMockRule();
@Test
public void myTest() throws Exception
{
// some test code using ClassToMock
MyHelper.staticMethod(param);
// some other test code
}
}
MyHelper 是来自另一个包的一些类,而 staticMethod() 是一些方法,我不需要对其进行模拟。此方法使用 Google Gson 和我的一些序列化程序(比方说 - MySerializer 类)。 PowerMock 为 Google Gson 和 MySerializer 抛出了 javassist.NotFoundException。 例如:
Caused by: javassist.NotFoundException: com.google.gson.GsonBuilder
at javassist.ClassPool.get(ClassPool.java:450)
at org.powermock.core.classloader.MockClassLoader.loadUnmockedClass(MockClassLoader.java:220)
我可以将这些类添加到类路径(到 Impored-Packages),但我不想这样做。为什么 PowerMock 会首先尝试加载在某些方法中使用的类,而这些方法应该只是一个“黑匣子”?
谁能解释一下?
另外,我可以使用 @PowerMockIgnore("com.google.*") 注释摆脱加载 Gson,但它不适用于 MySerializer。无论如何,这似乎不是一个合适的解决方案。
谢谢!
【问题讨论】:
-
不,说真的,为什么它会尝试对一切使用自己的类加载器?当我只是实例化某个 MyClass 类时(不需要对其进行模拟),PowerMock 尝试加载 MyClass 的 每个 依赖项,所有呈现 MyClass 方法参数或返回类型的类。但我什至没有调用一个方法!
-
你的类可能正在使用静态块,需要使用 powermock 来抑制它,这样它就不会去加载这些静态块所需的所有类
标签: java mockito junit4 powermock