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

Mockito:窥探一个spring的自动书写bean,这是不工作的

淳于星宇
2023-03-14

我要用模拟的approveActivity方法在间谍一个spring豆。

但这不是工作。

>

  • spring自动写入对象成功。

    间谍对象是成功的。

    模拟方法引发异常。

    在此输入代码

    我不知道为什么,请帮帮我!

    SpringFramework3.x和Mockito2.x以及JUnit4.x。

    public class ActivityBasicSmokeTest extends AbstractSmockMockito4SpringTest {
    
    
        @Autowired
        private ActivityReduceAPI activityReduceAPI;
    
        @Test
        public void testForApprovingActivityStatus() throws FileNotFoundException {
    
            ActivityReduceAPI spyActivityReduceAPI = Mockito.spy(this.activityReduceAPI);
    
            // stop auto audit
            Mockito.doReturn(new ResultGeneralModel<>(true)).when(spyActivityReduceAPI)
                .approveActivity("1", 2L);  <---- this is throw Exception.
    
        }
    
    }
    

    ActivityReduceAPImpl.java

    @Override
    public ResultGeneralModel<Boolean> approveActivity(String token, Long id) {
        try {
            AccountResponse account = sessionContext.getAccountFromTairByToken(token);
            ReduceActivityEntity activityEntity = activityService.get(id, account);
            ActivityParamUtil.validBeforeModified(activityEntity, ActivityStatusEnum.CREATE);
            Errors error = activityService.approveReduce(activityEntity, account);
            if (null != error) {
                return new ResultGeneralModel<>(error);
            }
            return new ResultGeneralModel<>(true);
        } catch (TfavatarBusException e) {
            return new ResultGeneralModel(ErrorUtil.getErrors(e));
        }
    }
    

    org.mockito.exceptions.misusing.unfinishedStubbingException:在com.taobao.film.tfavatar.domain.reduce.ActivityBasicSmoketest.TestForApprovingActivityStatus(ActivityBasicSmoketest.java:458)处检测到未完成的stubbing

    例如。thenReturn()可能丢失。正确拔茬示例:

    when(mock.isOk()).thenReturn(true);
    when(mock.isOk()).thenThrow(exception);
    doThrow(exception).when(mock).someVoidMethod();
    

    提示:1。缺少thenReturn()%2。您正在尝试截尾一个不受支持的最终方法3:在“then return”指令完成之前,您正在截尾内部另一个模拟的行为

    at com.taobao.film.tfavatar.api.impl.ActivityReduceAPIImpl.approveActivity(ActivityReduceAPIImpl.java:192)
    at com.taobao.film.tfavatar.api.impl.ActivityReduceAPIImpl$$FastClassBySpringCGLIB$$f237c997.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:701)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
    at org.springframework.validation.beanvalidation.MethodValidationInterceptor.invoke(MethodValidationInterceptor.java:93)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:633)
    at com.taobao.film.tfavatar.api.impl.ActivityReduceAPIImpl$$EnhancerBySpringCGLIB$$4b39213a.approveActivity(<generated>)
    at com.taobao.film.tfavatar.domain.reduce.ActivityBasicSmokeTest.testForApprovingActivityStatus(ActivityBasicSmokeTest.java:459)
    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.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83)
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:88)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:292)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:157)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
    at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
    
  • 共有1个答案

    蒯坚白
    2023-03-14

    编辑4:最后,在我自己建立了一个spring 3项目之后,我可以验证cglib生成的方法确实是最终的。

    打印出代理类的方法和它们的修饰符给了我如下所示:

    class test.ActivityReduceAPI$$EnhancerBySpringCGLIB$$747ceb58
    
    methods:
    ...
    approveActivity public final
    ...
    CGLIB$approveActivity$1 final
    ...
    
    

    使用CglibHelper类(可以在https://www.thekua.com/atwork/2011/06/finding-real-object-under--proxies/找到),我能够从代理提取真实对象。这样,测试就运行了。

        @Test
        public void testForApprovingActivityStatus() {
    
            ActivityReduceAPI spyActivityReduceAPI = Mockito.spy((ActivityReduceAPI) new CglibHelper(activityReduceAPI).getTargetObject());
    
            Mockito.doReturn(new ResultGeneralModel<Boolean>(true)).when(spyActivityReduceAPI)
                .approveActivity("1", 2L);
    
            Assert.assertTrue(spyActivityReduceAPI.test("1", 2L));
        }
    
     类似资料:
    • 我创建了一个特殊的应用程序ontext-test.xml在我的测试类中使用它。 应用程序上下文测试。xml 现在,我想使用我的作为自动安装的Bean并将其注入到我的模拟中。 TodoDaoTest.java 这是我的TodoDao类TodoDao。Java语言 当我执行我的测试方法时,我得到了一个java。com上的lang.NullPointerException。梅德赫利菲。教程。托多利斯特。

    • 在使用Spring AOP之前,我有一个这样的工作代码: 在哪里 在哪里 我的城市财产编辑自动接线工作正常。但是在为所有方法添加Spring AOP切入点之后: 城市地产编辑器的自动连接崩溃。事实上,bean不再属于CityProperty tyEditor类,而是简单地属性编辑器: 因此,我不得不将类从CityPropertyEditor更改为PropertyEditor,作为一种解决方法。有趣

    • 我使用的是Mockito1.9.0。我想在JUnit测试中模拟类的单个方法的行为,因此 问题是,在第二行中,实际上是被调用的,导致了一个异常。我使用模拟的唯一原因是,以后每当调用时,将不会调用真正的方法,而返回对象。 是接口,是接口的实现(如果这很重要的话)。 我需要做些什么来纠正这种间谍行为?

    • 我正在与Javascript、Mocha、Chai和SinonJ合作。我想做的是监视一个“equals”方法,该方法由另一个方法“compareUsingOperator”动态调用。下面的代码显示了我的类“StringComparator”,它有两个方法“equals”和“compareUsingOperator”。 这是我的单元测试: 在我的单元测试中,我在“equals”方法上设置了一个间谍,

    • 我希望表2(标题为“托管交易”)按日期自动排序,表1(标题为“贷款查询”)按姓氏自动排序。两张表都在一张谷歌表中。我已经找到了下面的脚本,我对它进行了轻微的修改,它在第2页上的效果非常好,可以按日期自动排序; 但是,我希望第一张工作表按照第2列中的姓氏自动排序,而不是脚本所指的第7列 值得一提的是,我对脚本做了以下更改,并在下面的脚本中添加了按姓氏排序的脚本,该脚本在第1页的第2列中运行良好; 但

    • 我正在尝试Mockito进行模拟和单元测试。 试图使用模拟autowired bean。但bean在运行时为空。 正在测试的类。 测试类: 错误: 我调试过,是因为(使用MockBean进行模拟,因为它是。) 这个代码有什么问题?