【问题标题】:mocking enum using powerMock使用 powerMock 模拟枚举
【发布时间】:2016-06-24 05:42:42
【问题描述】:

我正在尝试使用 powerMock 模拟 enum,但在运行测试时出现 Field 'fTestClass' was not found in class 错误。我发现问题出在 Junit 4.12 和 powermock-module-junit4 1.5.6 上。所以我改成了1.6.1,现在我遇到了错误...

java.lang.ExceptionInInitializerError
at sun.reflect.GeneratedSerializationConstructorAccessor9.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
at org.objenesis.instantiator.sun.SunReflectionFactoryInstantiator.newInstance(SunReflectionFactoryInstantiator.java:45)
at org.objenesis.ObjenesisBase.newInstance(ObjenesisBase.java:73)
at org.mockito.internal.creation.jmock.ClassImposterizer.createProxy(ClassImposterizer.java:142)
at org.mockito.internal.creation.jmock.ClassImposterizer.imposterise(ClassImposterizer.java:61)
at org.powermock.api.mockito.internal.mockcreation.MockCreator.createMethodInvocationControl(MockCreator.java:109)
at org.powermock.api.mockito.internal.mockcreation.MockCreator.mock(MockCreator.java:57)
at org.powermock.api.mockito.PowerMockito.mockStatic(PowerMockito.java:70)
at OrderEventProcessorTest.setUp(OrderEventProcessorTest.java:47)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.junit.internal.runners.MethodRoadie.runBefores(MethodRoadie.java:133)
at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:96)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:294)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:127)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:82)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:282)
at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:87)
at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:50)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:207)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:146)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:120)
at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34)
at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:122)
at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:106)
at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:53)
at org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:59)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:234)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:74)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
Caused by: java.lang.NullPointerException

基本上我试图模拟enum 来检查cassandra db 的插入、更新、删除操作的功能。枚举提供设置 cassadra db 连接。我想模拟它,所以我不需要连接到数据库来测试我的 crud 功能。如果 Junit 4.12 和 powermock 1.6.1 仍然存在任何版本问题,请告诉我。我正在使用mockito-core 1.10.19maven-surefire-plugin 2.19.1

已编辑

用于数据库连接的枚举

public enum CassProvider {
INSTANCE;
private Map<String,ThreadLocal<PreparedStatement>> psMap;
private String[] hostnames;
private String username;
private String password;
private String keyspace;
private Cluster cluster;
private Session session;

private CassProvider() {
    init();
    psMap = createPreparedStatements();
}
private void  init() {
    //get host, port, user , pasword from properties file
    cluster = Cluster.builder().addContactPoints(hostnames).withPort(port).withCredentials(username, password).build();
    session = cluster.connect(keyspace);
}
private static Map<String,ThreadLocal<PreparedStatement>> createPreparedStatements() {
    //code goes for mapping preparedStatements
    return psMap;
}
public PreparedStatement getPreparedStatement(String id) {
   //logic for preparedStatement
    return preparedStatement;
}
public Session getSession() {
    return session;
}
}

我想测试它执行不同准备语句的不同条件的代码

        if (eventMappingType != null && processEvent) {
            .......
            BatchStatement batchStatement = new BatchStatement();
            PreparedStatement psFieldInsert = CassProvider.INSTANCE.getPreparedStatement("INSERT_ORDERS_FV");

            if (eventMappingType.getSimpleFields() != null) {
                for (FieldType fieldType : eventMappingType.getSimpleFields().getField()) {
                    Object value = MVEL.executeExpression(fieldType.getSerializedExpr(), context);
                    batchStatement.add(psFieldInsert.bind(keyFields.get("orderNumber"),dateStringToDate(eventDateTime), fieldType.getValue(), value != null ? value.toString() : value));
                }
            }

            if (eventType.compareToIgnoreCase("OrderPlaced") == 0) {

                //Update the lookup table for given name 2 orders. 
                if (name != null && name.compareToIgnoreCase("")!=0) {
                    batchStatement.add(CassProvider.INSTANCE.getPreparedStatement("INSERT_ORDERS_BY_NAME").bind(name, dateStringToDate(eventDateTime), orderNumber));
                } 

                //Update the lookup table for accIds 2 orders; not sure if we need this for now
                if (accIds != null && accIds.compareToIgnoreCase("")!=0) {
                    batchStatement.add(CassProvider.INSTANCE.getPreparedStatement("INSERT_ORDERS_BY_ACCIDS").bind(accIds, dateStringToDate(eventDateTime), orderNumber));
                } 

                if (SAPOrderNumber != null) {
                    batchStatement.add(CassProvider.INSTANCE.getPreparedStatement("INSERT_SAP_ORDER").bind(SAPOrderNumber, orderNumber));
                } 
            }

            CassProvider.INSTANCE.getSession().execute(batchStatement);
        }

【问题讨论】:

  • 请也发布您的代码
  • 添加了代码,请检查。谢谢。

标签: java enums mockito powermock


【解决方案1】:

不确定您的 Cluster.builder() 方法是如何工作的,但我建议您将其设置为可配置的,即为您的测试类打开它以注入一个模拟构建器,该构建器最终返回一个模拟集群,该集群反过来返回一个模拟会话...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-03
    • 2015-07-19
    • 1970-01-01
    • 2022-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多