Jmockit TestNG / JUnit NullPointerException со швом - PullRequest
0 голосов
/ 05 декабря 2011

Все эти дни я использовал jmock со швом, но этого не достаточно, чтобы высмеивать final / static / enums.Поэтому я попытался работать с JMockit.Однако каждый раз, когда я бегу, я получаю NPE.Не могу даже отладить, ниже приведен пример кода

public class TestJmockit extends SeamTest {

@Mocked Dependency dependencyInCodeToTest;
CodeToTest bean = new CodeToTest();

@Test
 public void testSaveSectionChangesJMockit() throws Exception {
    new AbstractSeamTest.ComponentTest() {
        @Override
        protected void testComponents() throws Exception {

                new NonStrictExpectations()
                {
                  {
                    dependencyInCodeToTest.getLabel(); result = "Normal";
                  }
                };

                bean.execute();
        }
    }.run();
}

}

Фактический кодна следующую строку вызывает NPE.Если я уберу закомментированные строки в коде, он завершится с ошибкой в ​​первой не закомментированной строке.

Я использую Java 1.6 и IntelliJ IDE.Интересно, имеет ли это отношение к конфигурации IDE.

С TestNG я даже не получаю трассировку стека, с JUnit я вижу ниже ..

java.lang.NullPointerException
    at org.jboss.seam.servlet.ServletApplicationMap.get(ServletApplicationMap.java:54)
    at org.jboss.seam.contexts.BasicContext.get(BasicContext.java:49)
    at org.jboss.seam.contexts.BasicContext.get(BasicContext.java:44)
    at org.jboss.seam.core.Init.instance(Init.java:117)
    at org.jboss.seam.contexts.BusinessProcessContext.<init>(BusinessProcessContext.java:47)
    at org.jboss.seam.contexts.TestLifecycle.beginTest(TestLifecycle.java:35)
    at org.jboss.seam.mock.AbstractSeamTest$ComponentTest.run(AbstractSeamTest.java:159)
    at com.billmelater.csa.action.account.information.ConsumerAccountInformationActionTestJmockit.testSaveSectionChangesJMockit(ConsumerAccountInformationActionTestJmockit.java:27)
    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.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:73)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:46)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:180)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:41)
    at org.junit.runners.ParentRunner$1.evaluate(ParentRunner.java:173)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:220)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:71)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:199)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:62)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)


Process finished with exit code 255

1 Ответ

0 голосов
/ 20 декабря 2011

Общее возражение: существует насмешка, чтобы изолировать вас от внешнего кода, особенно от тех, которые поступают от поставщика вашего сервера (например, AbstractSeamtest) - так что вам не нужно их инициализировать или запускать сервер или что-то еще.

Считать фиктивный тест сохраненным сеансом отладки.В вашем случае вы хотели бы заверить (я предполагаю), что метод

bean.saveSectionChanges();

правильно взаимодействует с инфраструктурой шва или другими сотрудниками.Это легко достигается чем-то вроде:

public static testProperInteraction(@Mocked final Collaborator collaborator) {
    new Expectations() {
        {
            collaborator.doThis(with some parameters);
            returns(something you like);
        }
    };

   Bean bean = new Bean(collaborator);

  assertSomething(bean.saveSessionChanges());

   // nothing else shall be called
    new FullVerifications() {
        {
        }
    };
} 
...