java - JMockit 模拟在初始化期间抛出异常的类

标签 java mocking jmockit

例如,我一直在尝试创建 oracle.adf.share.security.identitymanagement.UserProfile 的模拟

@Test
public void testMyTest(@Mocked final UserProfile userProfile) {
    new Expectations() {
        {
           userProfile.getBusinessEmail();
           result = "me@me.com";
        }
    };

    unitUnderTest.methodUnderTest();
}

然而,我发现当 JMockit 尝试构造模拟时会抛出异常

java.lang.ExceptionInInitializerError
  at java.lang.Class.forName0(Native Method)
  at java.lang.Class.forName(Class.java:247)
  at oracle.jdevimpl.junit.runner.junit4.JUnit4Testable.run(JUnit4Testable.java:24)
  at oracle.jdevimpl.junit.runner.TestExecution.run(TestExecution.java:27)
  at oracle.jdevimpl.junit.runner.JUnitTestRunner.main(JUnitTestRunner.java:88)
Caused by: oracle.adf.share.security.ADFSecurityRuntimeException: EXC_FAILED_ID_STORE
  at oracle.adf.share.security.identitymanagement.UserManager.<init>(UserManager.java:111)
  at oracle.adf.share.security.identitymanagement.UserManager.<init>(UserManager.java:83)
  at oracle.adf.share.security.identitymanagement.UserProfile.<clinit>(UserProfile.java:62)

反编译 UserProfile 后,我可以看到它有类似这样的内容

public class UserProfile implements Serializable {
    ...
    private static UserManager _usrMgr = new UserManager();
    ...
}

UserManager 构造函数如下所示

public UserManager() {
    this((String) null);
}

public UserManager(String providerClassName) {
    if (providerClassName != null) {
        ...
    } else { 
        String clzName = ADFSecurityUtil.getIdentityManagementProviderClassName();
        if (clzName != null) {
            IdentityManagement provider = (IdentityManagement) createObject(clzName);
            setIdentityManagementProvider(provider);
        } else {
            throw new ADFSecurityRuntimeException("EXC_FAILED_ID_STORE");
        }
    }
}

现在我可以设置一个 Expectation 以在调用 ADFSecurityUtil.getIdentityManagementProviderClassName(); 时返回一些内容,但随后我预见到它尝试加载此类时会出现更多问题。

解决此问题的最佳方法是什么?

最佳答案

好的,所以我设法找到了解决方案 假货!这是我做的

@Test
public void testMyTest() {
    new Mockup<UserProfile>() {
        @Mock
        public void $cinit() {
            // do nothing
        }

        @Mock
        public String getBusinessEmail() {
            return "me@me.com";
        }
    };

    unitUnderTest.methodUnderTest();
}

关于java - JMockit 模拟在初始化期间抛出异常的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37859529/

相关文章:

mocking - JMockit Expectation API:如何在方法/构造函数调用时引发异常

java - 用于检索类中个体的 SPARQL 查询

ruby - 如何在 rspec 中正确模拟 openssl 对象?

testing - Rust:如何模拟 request::Result?

java - JMockit & 多个本地方法

java - Jmockit 模拟问题

java - 模拟器: Process finished with exit code -1073741511 (0xC0000139) Andrioid Studio

java - Netty 连接池

java - JPA 与 PostgreSQL - 简单关系

php - 是否可以对程序(非 oo)函数使用模拟?