使用Mockito在JUnit中使用PowerMock和PowerRule获取javassist.NotFoundException


问题内容

我已经在JUnit中将PowerMock和PowerRule与Mockito集成在一起。

这是我的依赖项:

<dependency>
        <groupId>javassist</groupId>
        <artifactId>javassist</artifactId>
        <version>3.12.0.GA</version>
      </dependency>
<dependency>
        <groupId>asm</groupId>
        <artifactId>asm</artifactId>
        <version>3.3.1</version>
</dependency>

 <dependency>
        <groupId>cglib</groupId>
        <artifactId>cglib</artifactId>
        <version>2.2.2</version>
 </dependency>
 <dependency>
        <groupId>org.powermoc</groupId>
    <artifactId>powermock-module-junit4</artifactId>
    <version>1.4.12</version>
    <scope>test</scope>
    </dependency>
 <dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-api-mockito</artifactId>
    <version>1.4.12</version>
    <scope>test</scope>
 </dependency>
 <dependency>
       <groupId>org.powermock</groupId>
       <artifactId>powermock-module-junit4-rule</artifactId>
       <version>1.4.12</version>
       <scope>test</scope>
 </dependency>
 <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-classloading-objenesis</artifactId>
        <version>1.4.12</version>
        <scope>test</scope>
 </dependency>

我的测试课是:

public class TestClass extends AbstractShiroTest{
    @Rule
    public PowerMockRule rule = new PowerMockRule();
    @Autowired
    SomeService someService;
    @Before

    public void setUp(){
    Map<String, Object> newMap = new HashMap<String, Object>();
    newMap.put("userTimeZone", "Asia/Calcutta");
    Subject subjectUnderTest = mock(Subject.class);
             when(subjectUnderTest.getPrincipal()).thenReturn(LMPTestConstants.USER_NAME);
    Session session = mock(Session.class);
    when(session.getAttribute(LMPCoreConstants.USER_DETAILS_MAP)).thenReturn(newMap);
    when(subjectUnderTest.getSession(false)).thenReturn(session);
    setSubject(subjectUnderTest);
    PowerMockito.mockStatic(CasSessionUtil.class);
    when(CasSessionUtil.getCarrierId()).thenReturn(1L);
}

  @Test

public void myTestMethod()  {
someService.doSomething();
 }
}

doSomething 正在调用我需要模拟的静态方法。当我运行测试用例时,我得到javassist.NotFoundException: $Proxy88

全栈跟踪:

java.lang.RuntimeException:javassist.NotFoundException:org.powermock.core.classloader.MockClassLoader.loadUnmockedClass(MockClassLoader.java:187)处的$
Proxy88在org.powermock.core.classloader.MockClassLoader.loadModifiedClass(MockClassLoader.java:147)处在org.powermock.core.classloader.DeferSupportingClassLoader.loadClass(DeferSupportingClassLoader.java:67)在java.lang.ClassLoader.loadClass(ClassLoader.java:252)在java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)在org.powermock的java.lang.Class.forName(Class.java:247)的java.lang.Class.forName0(本机方法)org.power.mock.api.support.ClassLoaderUtil.loadClass(ClassLoaderUtil.java:66)的java.lang.Class.forName(Class.java:247)。
org.powermock.classloading.DeepCloner.cloneFields(DeepCloner.java:上的api.support.ClassLoaderUtil.loadClass(ClassLoaderUtil.java:26)243)在org.powermock.classloading.DeepCloner.performClone(DeepCloner.java:128)在org.powermock.classloading.DeepCloner.cloneFields(DeepCloner.java:248)在org.powermock.classloading.DeepCloner.performClone(DeepCloner
:128)在org.powermock.classloading.DeepCloner.cloneFields(DeepCloner.java:248)在org.powermock.classloading.DeepCloner.performClone(DeepCloner.java:128)在org.powermock.classloading.DeepCloner.cloneFields(DeepCloner的org.powermock.classloading.DeepCloner.performClone(DeepCloner.java:128)的java:248)的org.powermock.classloading.DeepCloner.performClone(DeepCloner.DeepCloner.java:248)的org.powermock.classloading.DeepCloner.java:128)
.java:128)位于org.powermock.classloading.DeepCloner.cloneFields(DeepCloner.java:248),位于org.powermock.classloading.DeepCloner。org.powermock.classloading上的performClone(DeepCloner.java:128).org.org.powermock.classloading.DeepCloner.performClone(DeepCloner.java:128)的org.powermock.classloading.DeepCloner.cloneFields(DeepCloner.java:248)的org.powermock.classloading.DeepCloner
org.powermock.classloading的.clone(DeepCloner.java:82)。org.powermock.classloading的org.powermock.classloading.ClassloaderExecutor.execute(ClassloaderExecutor.java:89)的DeepCloner.clone(DeepCloner.java:69)位于org.powermock.modules.junit4.rule.PowerMockStatement.evaluate(PowerMockRule.java:49)的ClassloaderExecutor.execute(ClassloaderExecutor.java:78),位于org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat。
java:72),位于org.junit的org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)。在org.junit.runners.ParentRunner
$ 3.run(ParentRunner.java:193)在org.junit.runners.ParentRunner $
1.schedule(ParentRunner.java:52)的Runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
org.junit.runners.ParentRunner.access $
000(ParentRunner.java:42)上的.junit.runners.ParentRunner.runChildren(ParentRunner.java:191),org.junit.runners.ParentRunner
$ 2.evaluate(ParentRunner.java:184)
)于org.springframework的org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)的org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)处。
test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)在org.junit.runners.ParentRunner.run(ParentRunner.java:236)在org.eclipse的org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)的org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174)
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)上的.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)在org.eclipse.jdt.internal上org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)上的.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)在org.eclipse.jdt.internal.junit.runner上.RemoteTestRunner.main(RemoteTestRunner.java:197)原因:javassist.NotFoundException:org.powermock.core.classloader.MockClassLoader处javassist.ClassPool.get(ClassPool.java:436)的$
Proxy88。loadUnmockedClass(MockClassLoader.java:180)…还有46个

如果我将依赖关系更改为

<dependency>
            <groupId>org.powermock</groupId>
            <artifactId>powermock-classloading-xstream</artifactId>
            <version>1.4.12</version>
            <scope>test</scope>
        </dependency>

我什至尝试使用javassist 15版,但这也有同样的问题。


问题答案:

自己找出解决方案:

仅使用以下依赖项(用于Power Mock和Power Rule)

    <!-- Required for PowerMock -->
    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-api-mockito</artifactId>
        <version>1.4.12</version>
        <scope>test</scope>
    </dependency>
    <!-- Required for PowerMockRule -->
    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-module-junit4-rule-agent</artifactId>
        <version>1.4.12</version>
        <scope>test</scope>
    </dependency>

现在我没有上述任何一种异常