Mockito NotAMockException,显然是

时间:2012-04-25 13:10:29

标签: junit mockito spring-test

我正在使用Spring Test框架和Junit。我有一个弹簧上下文文件,我用于测试用例:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "classpath:spring/restTestContext.xml",
        "classpath:spring/webserviceContext.xml" })
@PrepareForTest(User.class)
public class RestTestsIT {

// This is a mock
@Autowired private AWSMailService mailService;
...
}

在restTestContext.xml中,我创建了一个AWSMailService类型的bean(实际上是一个模拟):

<bean id="mailService" name="mailService" class="org.mockito.Mockito" factory-method="mock">
    <constructor-arg value="com.acme.utils.email.AWSMailService" />
</bean>

在测试中,我试图验证mailService mock上是否调用了sendEmail()方法,但是我收到了NotAMockException,尽管在对象上调用toString()告诉我它是一个模拟:

public void testEmailSent() {
...
// Results in "Mock for AWSMailService, hashCode: 31777764"
System.out.println(mailService.toString());

// Results in NotAMockException
verify(mailService).sendEmail(any(String.class), ...);
}

有没有人有任何想法可能导致这个?

由于

3 个答案:

答案 0 :(得分:1)

Spring是否为这个对象创建了一个代理,因此Mockito认为它不是一个模拟器,因为你得到一个Proxy $ 34类作为调用者和你的模拟对象之间的中间人?

答案 1 :(得分:1)

我遇到了同样的问题,我使用的是mockito 1.8.1,在版本1.9.0中问题已修复。

现在Mockito的有效模拟算法已经改变,并且与弹簧代理bean没有冲突。

答案 2 :(得分:0)

修正了它:)

问题在于Mockito确实正在创建一个Mock,但是Spring正在代理它并且Mockito没有足够的智能来解决模拟器周围的代理问题。

我现在在单元测试中手动创建模拟并连接它们:

@Mock private AWSMailService mailService;
@Autowired private UserService userService;

@Before
public void setup() {
  ((UserServiceImpl) userService).setMailService(mailService);
}