Mockito NotAMockException当它显然是



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

@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>

在测试中,我试图验证 sendEmail() 方法是否在 mailService 模拟上被调用,但我得到了一个 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), ...);
}

有没有人知道可能导致这种情况的原因是什么?

谢谢

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

我遇到了同样的问题,我使用的是 mockito 1.8.1,在 1.9.0 版中问题已得到解决。

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

修复了它:)

问题在于 Mockito

确实在创建一个 Mock,但 Spring 随后代理了它,而 Mockito 不够聪明,无法确定模拟周围有一个代理。

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

@Mock private AWSMailService mailService;
@Autowired private UserService userService;
@Before
public void setup() {
  ((UserServiceImpl) userService).setMailService(mailService);
}

相关内容

  • 没有找到相关文章

最新更新