JMockit的Java代理未初始化JMockit。

4
我已经为一些使用Robolectric的JUnit测试设置了JMockit,但是我遇到了错误。我主要使用maven来运行测试。
当我使用mvn test运行测试,并按照这里指定的配置javaagent时,我会得到通常的异常:

java.lang.IllegalStateException: JMockit wasn't properly initialized; check that jmockit.jar precedes junit.jar in the classpath (if using JUnit; if not, check the documentation)

我已经验证了JMockit在mvn dependency:build-classpathmvn test --debug中在JUnit之前出现在类路径上。我还验证了-javaagent参数是否正确地被mvn test --debug调用。
库版本:
  • JDK 1.6
  • JMockit 1.5
  • JUnit 4.8.2
  • Robolectric 2.2 Robolectric运行器阻止我使用JMockit运行器。
  • Maven 3.0.3
  • Surefire 2.14.1

测试类如下:

@RunWith(RobolectricTestRunner.class)
public class HelpFragTest {

    FragmentActivity activity;
    FragmentManager fragmentManager;
    @Mocked ActionBarManager actionBarManager;

    @Before
    public void setup() throws Exception {
        activity = Robolectric.buildActivity(FragmentActivity.class).create().resume().get();
        fragmentManager = activity.getSupportFragmentManager();
        MyApplication.instance().setActionBarManager(actionBarManager);
    }

    @Test
    public void testShow(){
        new NonStrictExpectations() {{
            Helper.staticMethod(anyString, anyString);
            actionBarManager.clear();
            actionBarManager.setTitle(anyString);
            actionBarManager.refresh();
        }};
        HelpFrag frag = HelpFrag.newInstance();
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        transaction.add(frag, StringUtils.EMPTY);
        transaction.commit();

        assertTrue(frag.isVisible());

    }
}

我也尝试过不使用显式的运行程序或Java代理,此时从相同的代码中会得到以下异常:

java.lang.IllegalStateException: 记录期望的位置无效


2个回答

2

我遇到了同样的问题,问题似乎是Robolectric测试运行器干扰了JMockit-JUnit集成。请参见此链接


看起来你和我遇到了很多相同的问题。如果有机会,请加入我在Android单元测试的讨论中。如果我不在那里,请使用@C.Ross提醒我。 - C. Ross

1

症状: 在Java项目中使用Jmockit和JUnit运行Maven时出现错误。

信息: JMockit未正确初始化;请检查类路径中jmockit.jar是否在junit.jar之前(如果使用JUnit;如果不是,请查看文档)

原因:

POM.xml文件配置错误。Jmockit依赖项在junit之后。

解决方案:

编辑POM.xml文件。jmockit.jar应该在junit.jar之前,然后jmockit依赖项应该在junit之前。(始终将jmockit放在junit之前)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接