Как смоделировать метод, унаследованный от абстрактного класса, с помощью EasyMock? - PullRequest
5 голосов
/ 20 июня 2011

Я борюсь с EasyMock. Я написал два небольших класса, чтобы проиллюстрировать мою проблему:

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 макет класса, который расширяет абстрактный класс?

Когда я запускаю этот тест, я получаю следующую трассировку сбоя:

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

О да, я использую Eclipse 3.6.2, JUnit 4.8.2 и EasyMock 3.0.

РЕДАКТИРОВАТЬ: Кажется, PowerMock может обрабатывать насмешливые финальные методы, унаследованные от абстрактных классов! http://code.google.com/p/powermock/wiki/MockFinal

1 Ответ

6 голосов
/ 20 июня 2011

Я думаю, что это не связано с абстрактными классами и так далее. Это связано с тем, что EasyMock не может издеваться над final методами. Из документации EasyMock :

Финальные методы не могут быть высмеяны. Если вызывается, их нормальный код будет выполнен

Итак, вы должны сделать свой метод не финальным или использовать какой-то другой подход к тестированию, который не требует насмешек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...