java - 如何在真实的Web容器中使用Mockito来模拟一些接口(interface)

标签 java mocking mockito wildfly

是否可以使用 Mockito 模拟接口(interface),而不是在单元测试或 Arquilian 测试中,而是在真正的 WEB 容器中?
我想做的是从 IBM Filenet API 模拟这两个接口(interface):DocumentProperties测试在容器(WildFly)中运行的 Spring 应用程序,而无需真正连接到 IBM/Filenet 框架。

<小时/>

UnitTest 工作正常,例如这个:

@Test
public void mock() {
    Document d = Mockito.mock(Document.class);
    Properties p = Mockito.mock(Properties.class);

    Mockito.when(d.getProperties()).thenReturn(p);
    Mockito.when(p.getStringValue("Ala")).thenReturn("Bella");
    ....
    ....
 }

但是当我尝试运行部署到容器的代码时:

@Override
public DocumentSet someMethod(String ..... ) {

    Document d = mock(Document.class);  // this line throws an Exception
    Properties p = mock(Properties.class);
    when(d.getProperties()).thenReturn(p);
    .....

我在这一行收到 ClassNotFoundException 异常:Document d = mock(Document.class);

1:18:11,310 ERROR [org.springframework.batch.core.step.AbstractStep] (SimpleAsyncTaskExecutor-1) Encountered an error executing step csvFilesProcessStep in job process_csv_files: java.lang.NoClassDefFoundError: org/mockito/Mockito
    at com.somepackage.step.ce.CeOperationsProcessorTestImpl.searchAndFetchDocumentsById(CeOperationsProcessorTestImpl.java:44)
    at com.somepackage.step.CvsFilesProcessor.processFile(CvsFilesProcessor.java:110)
    at com.somepackage.step.CvsFilesProcessor.process(CvsFilesProcessor.java:83)
    at com.somepackage.step.CvsFilesProcessor.process(CvsFilesProcessor.java:1)
    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:498)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
    at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:133)
    at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:121)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
    at com.sun.proxy.$Proxy62.process(Unknown Source)
    at org.springframework.batch.core.step.item.SimpleChunkProcessor.doProcess(SimpleChunkProcessor.java:126)
    at org.springframework.batch.core.step.item.SimpleChunkProcessor.transform(SimpleChunkProcessor.java:293)
    at org.springframework.batch.core.step.item.SimpleChunkProcessor.process(SimpleChunkProcessor.java:192)
    at org.springframework.batch.core.step.item.ChunkOrientedTasklet.execute(ChunkOrientedTasklet.java:75)
    at org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:406)
    at org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:330)
    at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:133)
    at org.springframework.batch.core.step.tasklet.TaskletStep$2.doInChunkContext(TaskletStep.java:271)
    at org.springframework.batch.core.scope.context.StepContextRepeatCallback.doInIteration(StepContextRepeatCallback.java:77)
    at org.springframework.batch.repeat.support.RepeatTemplate.getNextResult(RepeatTemplate.java:368)
    at org.springframework.batch.repeat.support.RepeatTemplate.executeInternal(RepeatTemplate.java:215)
    at org.springframework.batch.repeat.support.RepeatTemplate.iterate(RepeatTemplate.java:144)
    at org.springframework.batch.core.step.tasklet.TaskletStep.doExecute(TaskletStep.java:257)
    at org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:198)
    at org.springframework.batch.core.job.SimpleStepHandler.handleStep(SimpleStepHandler.java:148)
    at org.springframework.batch.core.job.flow.JobFlowExecutor.executeStep(JobFlowExecutor.java:64)
    at org.springframework.batch.core.job.flow.support.state.StepState.handle(StepState.java:67)
    at org.springframework.batch.core.job.flow.support.SimpleFlow.resume(SimpleFlow.java:165)
    at org.springframework.batch.core.job.flow.support.SimpleFlow.start(SimpleFlow.java:144)
    at org.springframework.batch.core.job.flow.FlowJob.doExecute(FlowJob.java:134)
    at org.springframework.batch.core.job.AbstractJob.execute(AbstractJob.java:304)
    at org.springframework.batch.core.launch.support.SimpleJobLauncher$1.run(SimpleJobLauncher.java:135)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.ClassNotFoundException: org.mockito.Mockito from [Module "deployment.someapp_web-1.1.3-SNAPSHOT.war:main" from Service Module Loader]
    at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:198)
    at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:363)
    at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:351)
    at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:93)
    ... 39 more

现在我对这两个接口(interface)实现了自己的测试实现,但是很乏味,因为它们有数百个方法。

最佳答案

最有可能的是,您将 Mockito 作为 Maven 中的测试依赖项(或用于构建代码的任何内容)。在 pom.xml文件中,会有一行 <scope>test</scope><dependency>导入 Mockito 的标记。如果您注释掉该行,您应该能够找到该类。另外,WildFly 需要 Mockito JAR 文件,因此请确保它位于 WAR 文件或 lib 目录中。

但是...您不是想在生产服务器上进行集成测试吗?我一生都无法想象你为什么要做这样的事。这是一项工作,但您想要做的是编写一个集成测试来启动服务器、部署代码、测试它并关闭服务器。谷歌搜索 java integration test .

关于java - 如何在真实的Web容器中使用Mockito来模拟一些接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48663218/

相关文章:

java - 如何通过模式获取物理地址?

java - GWT RPC : Is it secure to send plain-text password

java - Powermock 的问题

unit-testing - 有没有办法在你的单元测试中覆盖 Perl "use constant"?

java - 是否可以在 Java 中扩展没有构造函数的类?

java - 具有泛型的模拟方法并在返回类型中扩展

java - mockito 未模拟的 Autowiring bean 上的空指针

java - CardLayout没有完全隐藏其他卡片?

java - jackson 忽略了 parent 的所有字段

c# - 最小起订量,调用具有构造函数依赖性的基础