我有一个名为restTemplate的类。它是来自 Spring Framework 的 RestTemplate 对象。我正在尝试在我的 Mockito 测试的设置方法开始时重置它,但我得到异常:
org.mockito.exceptions.misusing.NotAMockException: Argument should be a mock, but is null!
那我做错了什么呢?我有正确的软件包列在下面
<context:component-scan base-package = "..."/>
它自动连接到我的测试类中,并列在我的应用程序上下文测试.xml文件中。我应该首先看什么?
编辑:
<bean id="restTemplate" class="org.mockito.Mockito" factory-method="mock">
<constructor-arg value="org.springframework.web.client.RestTemplate" />
</bean>
根据 API:Mockito.mock 采用Class<?>
的实例,但在 Spring 配置中,您传递的是一个类的完全限定名称的String
,但它不是Class<?>
实例。
这就引出了一个问题,你为什么要在 Spring 配置中设置模拟?为什么不在测试中实例化被测类并在那里创建模拟。模拟是设计给你单元测试的。如果您正在加载上下文,则可能正在接近集成测试。并不是说在 JUnit 测试中加载上下文是一件坏事,但是在其中使用 Mocks 似乎混淆了事情。
但是,如果您真的想尝试一下,则可以尝试使用Class.forName作为工厂方法声明一个作为类实例的bean。像这样:
<bean id="classInstance" class="java.lang.Class" factory-method="forName">
<constructor-arg value="org.springframework.web.client.RestTemplate" />
</bean>
<bean id="restTemplate" class="org.mockito.Mockito" factory-method="mock">
<constructor-arg ref="classInstance" />
</bean>