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