Java 结合PowerMock的生成代码测试

Java 结合PowerMock的生成代码测试,java,compiler-construction,code-generation,classloader,powermock,Java,Compiler Construction,Code Generation,Classloader,Powermock,我最近遇到了麻烦。我正在编写一些单元测试来练习我的库中负责代码生成的部分。代码获取配置对象的输入,使用CodeModel编写代码,将这些类转储为字符串,然后使用Java6编译器api将它们动态编译为可用类 我遇到的障碍是我在生成的代码中测试的方法之一,它使用带有最终方法的类(Android Bundle)并在使用时抛出异常(“java.lang.RuntimeException:Stub!”)。因此,为了解决这个问题,我使用PowerMock来模拟最终的方法。然而,在本例中,编译器API抛出一个

我最近遇到了麻烦。我正在编写一些单元测试来练习我的库中负责代码生成的部分。代码获取配置对象的输入,使用CodeModel编写代码,将这些类转储为字符串,然后使用Java6编译器api将它们动态编译为可用类

我遇到的障碍是我在生成的代码中测试的方法之一,它使用带有最终方法的类(Android Bundle)并在使用时抛出异常(“java.lang.RuntimeException:Stub!”)。因此,为了解决这个问题,我使用PowerMock来模拟最终的方法。然而,在本例中,编译器API抛出一个NPE。我想这是因为PowerMock在幕后使用的设施,但我不确定

例外情况如下:

at org.androidtransfuse.gen.classloader.MemoryFileManager.<init>(MemoryFileManager.java:11)
at org.androidtransfuse.gen.classloader.MemoryClassLoader.<init>(MemoryClassLoader.java:16)
at org.androidtransfuse.gen.ParcelableGeneratorTest.setup(ParcelableGeneratorTest.java:67)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at org.junit.internal.runners.MethodRoadie.runBefores(MethodRoadie.java:129)
at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:93)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:296)

Powermock Google小组的Johan为我做了这个,但我想我也会在这里添加结果

对我有效的方法是从@RunWith(PowerMockRunner.class)方法转变为所描述的Java代理方法

这需要我删除@RunWith注释,并将以下内容添加到我的Maven POM中:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
        <argLine>
            -javaagent:${settings.localRepository}/org/powermock/powermock-module-javaagent/1.4.12/powermock-module-javaagent-1.4.12.jar
        </argLine>
    </configuration>
</plugin>

org.apache.maven.plugins
maven surefire插件
-javaagent:${settings.localRepository}/org/powermock/powermock模块javaagent/1.4.12/powermock-module-javaagent-1.4.12.jar
在IDE中运行单元测试时,我必须添加

-javaagent: <jarpath>/powermock-module-javaagent-1.4.12.jar
-javaagent:/powermock-module-javaagent-1.4.12.jar
到运行配置

@RunWith(PowerMockRunner.class)
@PrepareForTest(Parcel.class)
public class ExampleTest {

    private static final String TEST_VALUE = "test value";

    String classToCompile =
            "import android.os.Parcel;\n" +
            "\n" +
            "public class ClassToCompile\n" +
            "{\n" +
            "\n" +
            "    private Parcel parcel;\n" +
            "}";

    @Test
    public void test() throws ClassNotFoundException, IOException, NoSuchMethodException, InvocationTargetException, IllegalAccessException, InstantiationException {
        MemoryClassLoader classLoader = new MemoryClassLoader();
        classLoader.add("ClassToCompile", classToCompile);
        classLoader.loadClass("ClassToCompile");
    }
}
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
        <argLine>
            -javaagent:${settings.localRepository}/org/powermock/powermock-module-javaagent/1.4.12/powermock-module-javaagent-1.4.12.jar
        </argLine>
    </configuration>
</plugin>
-javaagent: <jarpath>/powermock-module-javaagent-1.4.12.jar