我正在使用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), ...);
}
有没有人有任何想法可能导致这个?
由于
答案 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);
}