mockit.internal.MissingInvocation异常-使用Spring、Jmockit

mockit.internal.MissingInvocation异常-使用Spring、Jmockit,spring,junit4,jmockit,Spring,Junit4,Jmockit,我正在将JMockit与Spring一起使用,并试图从我的服务层验证一些方法,但未能成功 找到下面的示例代码 UserRepositoryImpl.java package com.test.jmockit.JMockitsample.repository.impl; import org.springframework.stereotype.Repository; import com.test.jmockit.JMockitsample.User; import com.test.jmo

我正在将JMockit与Spring一起使用,并试图从我的服务层验证一些方法,但未能成功

找到下面的示例代码

UserRepositoryImpl.java

package com.test.jmockit.JMockitsample.repository.impl;

import org.springframework.stereotype.Repository;

import com.test.jmockit.JMockitsample.User;
import com.test.jmockit.JMockitsample.repository.UserRepository;

@Repository("userRepository")
public class UserRepositoryImpl implements UserRepository{



    /**
     * Not yet implemented. 
     * 
     * @param User
     * @return
     */
    public User getLoggedInUser() {

        User user =  new User();
        user.setUsername("admin");
        user.setPassword("test123");
        return user;
    }

}
UserServiceImpl.java

/**
 * 
 */
package com.test.jmockit.JMockitsample.service.impl;


import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.test.jmockit.JMockitsample.User;
import com.test.jmockit.JMockitsample.repository.UserRepository;
import com.test.jmockit.JMockitsample.service.UserService;


    @Service("userService")
    public class UserServiceImpl implements UserService{


        @Autowired
        private UserRepository userRepository;


        public User getLoggedInUser() {
            // TODO Auto-generated method stub

            User user = userRepository.getLoggedInUser();
            System.out.println("user service " + user.getUsername());
            return user;
        }

    }
还有我的测试班

@ContextConfiguration(locations = { "classpath:/ApplicationContext.xml" })
@RunWith(SpringJUnit4ClassRunner.class)
public class JMockitVerificationTest {

    @Tested
    private UserService userService = new UserServiceImpl();

    @Injectable
    private UserRepository userRepository;


    @Test
    public void testUserServiceUserList() {
        new Expectations() {
            {
                userRepository.getLoggedInUser();
                result = new User("guest", "test123");
            }
        };

        userService.getLoggedInUser();

        new Verifications() {

            {
                userRepository.getLoggedInUser();
            }
        };

    }
}
如果我删除验证块并获得预期结果,则运行成功

尝试验证我的方法是否在服务中被调用,但得到以下异常

mockit.internal.MissingInvocation: Missing invocation of:
com.test.jmockit.JMockitsample.repository.UserRepository#getLoggedInUser()
   on mock instance: com.test.jmockit.JMockitsample.repository.$Impl_UserRepository@425407
        at com.test.jmockit.JMockitVerificationTest$2.<init>(JMockitVerificationTest.java:45)
        at com.test.jmockit.JMockitVerificationTest.testUserServiceUserList(JMockitVerificationTest.java:42)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:497)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:497)
        at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
        at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
        at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
        at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:254)
        at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:89)
        at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
        at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
        at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:193)
        at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:242)
        at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:137)
        at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:497)
        at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)
        at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)
        at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)
        at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115)
        at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75)
Caused by: Missing invocation
        ... 24 more
mockit.internal.MissingInvocation:缺少以下调用:
com.test.jmockit.JMockitsample.repository.UserRepository#getLoggedInUser()
在模拟实例上:com.test.jmockit.JMockitsample.repository.$Impl_UserRepository@425407
位于com.test.jmockit.JMockitVerificationTest$2。(JMockitVerificationTest.java:45)
位于com.test.jmockit.JMockitVerificationTest.testUserServiceUserList(JMockitVerificationTest.java:42)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于java.lang.reflect.Method.invoke(Method.java:497)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于java.lang.reflect.Method.invoke(Method.java:497)
位于org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
位于org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
位于org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
位于org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:254)
位于org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:89)
位于org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
位于org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
位于org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:193)
位于org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:242)
位于org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:137)
位于org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于java.lang.reflect.Method.invoke(Method.java:497)
位于org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)
位于org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)
位于org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)
位于org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115)
位于org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75)
原因:缺少调用
... 还有24个

我不知道我在哪里犯了错误使它成功,提前谢谢。

如果没有使用自定义Spring runner(即,如果您删除
@RunWith
行),测试是否仍然失败?是的,它仍然失败,但有相同的异常。不幸的是,我无法重现该问题。我从问题中复制了代码,但无论是否使用
@RunWith
,它都运行良好(无例外)。谢谢-Rogerio,但就我而言,它完全失败了,我不知道为什么。当我使用非严格预期而不是预期时,我发现了另一种方法。它按预期工作。如果不使用自定义Spring runner(即,如果删除
@RunWith
行),测试是否仍然失败?是的,它仍然失败,但有相同的异常。不幸的是,我无法重现该问题。我从问题中复制了代码,但无论是否使用
@RunWith
,它都运行良好(无例外)。谢谢-Rogerio,但就我而言,它完全失败了,我不知道为什么。我只是找到了另一种选择,当我使用非严格的预期而不是预期时,它会像预期的那样工作。