1

私は次のクラスを持っています:

class MyClass{

    private static final int VERSION_VALUE = 8;

    private static final String VERSION_KEY = "versionName";

    public boolean myPublicMethod(String str) {
        try { 
            return myPrivateMethod(str, VERSION_KEY, VERSION_VALUE,
                    new MyInnerClass() {

                    @Override
            public InputStream loadResource(String name) {
                            //do something important
                        }
                    });
        }
        catch (Exception e) {           
        }
        return false;
    }


private boolean myPrivateMethod(String str, String key, int version,
            ResourceLoader resourceLoader) throws Exception
    {
       //do something 
    }

    private static abstract class MyInnerClass {

        public abstract InputStream loadResource(String name);

    }
}

resourceLoader オブジェクトを渡し、その loadResource メソッドをオーバーライドする必要がある myPrivateMethod の単体テストを作成したいと考えています。

これが私のテスト方法です:

@Test
public void testMyPrivateMethod() throws Exception {
    Class<?> cls = Class.forName("my.pack.MyClass$MyInnerClass");
    Method method = cls.getDeclaredMethod("loadResource", String.class);
    //create inner class instance and override method
    Whitebox.invokeMethod(myClassObject, "testValue1", "testValue2", "name1", 10, innerClassObject);
}

コードを変更できないことに注意してください。

4

2 に答える 2

0

さて、あなたのコードで見られる問題は、あなたが myPublicMethod を呼び出しており、4 番目のパラメーターを new MyInnerClass() として与えていることです。プライベート メソッドで 4 番目のパラメーターが ResourceLoader として指定され、コードから MyInnerClass と ResourceLoader の間に関係がありません。したがって、次のコードを試すことができます。それは役立つかもしれません。

コードを変更できないという警告にもかかわらず、コードを実行しようとしていたため、コードを変更しました。

class MyClass{

    private static final int VERSION_VALUE = 8;

    private static final String VERSION_KEY = "versionName";

    public boolean myPublicMethod(String str) {
        try { 
            return myPrivateMethod(str, VERSION_KEY, VERSION_VALUE,
                    new MyInnerClass() {

                    @Override
            public InputStream loadResource(String name) {
                return null;
                            //do something important
                        }
                    });
        }
        catch (Exception e) {           
        }
        return false;
    }


private boolean myPrivateMethod(String str, String key, int version,
            MyInnerClass resourceLoader) throws Exception
    {
        return false;
       //do something 
    }

    private static abstract class MyInnerClass {

        public abstract InputStream loadResource(String name);

    }
}

それが役に立てば幸い。

于 2013-02-24T18:04:30.660 に答える
0

まあ、あなたはJavassistを使うことができます...

この質問を参照してください。私はこれを試していませんが、オーバーライドが必要なときにこのメソッドを呼び出すことができます:

public <T extends Object> T getOverride(Class<T> cls, MethodHandler handler) {
    ProxyFactory factory = new ProxyFactory();
    factory.setSuperclass(cls);
    factory.setFilter(
            new MethodFilter() {
                @Override
                public boolean isHandled(Method method) {
                    return Modifier.isAbstract(method.getModifiers());
                }
            }
        );

    return (T) factory.create(new Class<?>[0], new Object[0], handler);
}
于 2013-02-24T17:24:29.513 に答える