5

EasyMockで苦労しています。私は自分の問題を説明するために2つの小さなクラスを書きました:

public abstract class A {
    private AtomicReference<Integer> id = new AtomicReference<Integer>(null);
    public final int getId() {
        return id.get();
    }
    public final boolean setId(int id) {
        return this.id.compareAndSet(null, id);
    }
}

public class B extends A {
}

次に、次のようにテストメソッドを作成します。

public class EasyMockTester extends EasyMockSupport {
    @Test
    public void test() {
        B b = EasyMock.createStrictMock(B.class);
        EasyMock.expect(b.getId()).andReturn(100);
        replayAll();
        int id = b.getId();
        System.out.println("The ID is: " + id);
        verifyAll();
    }
}

問題は、EasyMockにクラスBのインスタンスを単純にモックさせたいことです(実際のクラスは空ではありませんが、代わりに抽象クラスから継承されたメソッドにメソッドを追加します)。代わりに、EasyMockは実際にクラスAのコードに入り、NullPointerExceptionについて文句を言い始めます。EasyMockを抽象クラスを拡張するクラスのモックにするにはどうすればよいですか?

このテストを実行すると、次の失敗トレースが表示されます。

太陽のcom.my.project.package.tests.EasyMockTester.test(EasyMockTester.java:11)​​のcom.my.project.package.tests.A.getId(A.java:9)のjava.lang.NullPointerException。 Reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)at java.lang.reflect.Method.invoke( Method.java:597)at org.junit.runners.model.FrameworkMethod $ 1.runReflectiveCall(FrameworkMethod.java:44)at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)atorg。 junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)atorg。junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79)at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71)at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)at org .junit.runners.ParentRunner $ 3.run(ParentRunner.java:193)at org.junit.runners.ParentRunner $ 1.schedule(ParentRunner.java:52)at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191 )org.junit.runners.ParentRunner.access $ 000(ParentRunner.java:42)at org.junit.runners.ParentRunner $ 2.evaluate(ParentRunner.java:184)at org.junit.runners.ParentRunner.run(ParentRunner。 java:236)org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)atorg.eclipse.jdt.internal.junit.runner.TestExecution。run(TestExecution.java:38)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner。 java:683)org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

そうそう、私はEclipse 3.6.2、JUnit 4.8.2、EasyMock3.0を使用しています。

編集:PowerMockは抽象クラスから継承されたモックのfinalメソッドを処理できるようです!http://code.google.com/p/powermock/wiki/MockFinal

4

1 に答える 1

6

抽象クラスなどには関係ないと思います。これは、EasyMock がメソッドをモックできないことが原因finalです。EasyMockのドキュメントから:

Final メソッドはモックできません。呼び出されると、通常のコードが実行されます

そのため、メソッドを非最終的なものにするか、モックを必要としないテストへの他のアプローチを使用する必要があります。

于 2011-06-20T14:54:38.767 に答える