当前位置: 首页 > 知识库问答 >
问题:

如何使用Spring autowiring泛化JMockit测试

松博耘
2023-03-14

因此,我想对一些不同的Dao方法使用一个通用测试。在Dao内部,我实现了与实体无关的save功能,因此我认为最好也使测试实体独立。目前,我有一个jmockit测试,它是与Spring一起autowired的。

@Injectable
public EntityManager em;

@Tested
SyncClaimDao syncClaimDao = new SyncClaimDaoImpl();

@Before
public void setUp() {
    Deencapsulation.setField(syncClaimDao, "em", em);
}

private void testSaveEntity (Class T) {
    // Existing claim happy path
    new Expectations() {
        {
            em.contains(any); result = true;
            em.merge(any);
        }
    };

    if (T.isInstance(SyncClaimEntity.class)) {
        Assert.assertTrue(syncClaimDao.saveClaim(new SyncClaimEntity()));
    } else if (...) {...}
}

@Test
public void testSaveClaim() {
    testSaveEntity(SyncClaimEntity.class);
}

Syncclaimdaoimpl

@Override
public boolean saveClaim(SyncClaimEntity claim) {
    return saveEntity(claim);
}

private boolean saveEntity(Object entity) {
    boolean isPersisted = false;

    try {
        isPersisted = em.contains(entity);

        if (isPersisted) {
            em.merge(entity);
        } else {
            em.persist(entity);
            em.flush();
            isPersisted = true;
        }
        logger.debug("Persisting " + entity.getClass().getSimpleName() + ": " + entity.toString());
    }
    catch (NullPointerException ex) {
        ...
    }
    catch (IllegalArgumentException ex) {
        ...
    }

    return isPersisted;
}
mockit.internal.MissingInvocation: Missing invocation of:
javax.persistence.EntityManager#contains(Object)
   with arguments: any Object
   on mock instance: javax.persistence.$Impl_EntityManager@44022631
    at at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    ... 4 more 
Caused by: Missing invocation
    at [redacted].dal.dao.SyncClaimDaoImplTest$1.<init>(SyncClaimDaoImplTest.java:48)
    at [redacted].dal.dao.SyncClaimDaoImplTest.testSaveEntity(SyncClaimDaoImplTest.java:46)
    at [redacted].dal.dao.SyncClaimDaoImplTest.testSaveClaim(SyncClaimDaoImplTest.java:67)
    ... 10 more
@Test
public void testSaveClaim() {

    new Expectations() {
        {
            em.contains(any); result = true;
            em.merge(any);
        }
    };

    Assert.assertTrue(syncClaimDao.saveClaim(new SyncClaimEntity()));

共有1个答案

酆俊远
2023-03-14

我现在看到了错误:t.isinstance(SyncClaimentity.class)类#isinstance(Object)方法应该用类的实例调用,而不是用类本身调用;因此,它总是返回false,因为SyncClaimEntity.class显然不是SyncClaimEntity的实例。

 类似资料:
  • 我有一个maven项目,其中jmockit 1.18用于嘲笑,surefire用于运行测试套件,Jacoco用于测量代码覆盖率。 当我尝试将jmockit升级到1.45版时,它在初始化测试套件运行程序VM时出错。但是,当javaagent作为argline参数显式传递时,测试就会执行。 有人能告诉我是否有办法禁用jmockit检测或代理初始化吗?

  • 我正在使用一个用Groovy编写的Spock测试来测试一些Java代码。我使用JMockit来模拟java代码中的方法,因为Spock只处理模拟Groovy类。我遇到了一个问题,在测试之间存在一个JMockit。这样的模拟实例应该只存在于测试中(根据JMockit文档),但这不起作用,我想这是因为它没有使用JMockit测试运行器,而是使用了Spock测试运行器。 问题 有什么方法可以手动移除JM

  • 我使用Gradle(里程碑8a)在IBM J9 JVM的项目上运行JUnit测试,根据“用JMockit运行测试”,这需要将参数传递给JVM。然而,JMockit并没有注入mocked参数,这导致我的测试以“method(foo)应该没有参数”而失败,测试在Eclipse的HotSpot JVM上运行良好。 我扩展了任务,以查找JAR并将参数添加到中,如下所示: 的输出确认正在使用参数: 我很确定

  • 问题内容: 以下是有关如何使Java通用类将单个项目附加到数组的代码段。如何使appendToArray成为静态方法。在方法签名中添加static会导致编译错误。 问题答案: 您唯一可以做的就是将您的签名更改为 重要细节: 返回值之前的泛型表达式始终会引入(声明)新的泛型类型变量。 另外,类型()和静态方法()之间的类型变量永远不会相互干扰。 因此,这意味着什么:如果方法不是,则我的答案将隐藏。A

  • 注意:我已经做了一个搜索和阅读了各种博客,但找不到一个例子,与我正在尝试做什么。 它似乎不喜欢我的某个测试成员字段是私有的,但没有告诉我它对哪个字段有问题。我见过的单元测试的所有例子,唯一公开的一定是ExpectedException规则。

  • 问题: 当我启动我的测试jetty-server并制作我的控制器模型时,模型不起作用!我认为原因是不同的ClassLoader:jMockit-AppClassLoader,jetty-WebAppClassLoader。 问题: 您应该看到JettyDeploymentIntegrationUnitTestCase.RequestWebApp方法:在这些方法中,我们使mock不起作用。 您可以检