我正在尝试模拟一些方法调用,但不幸的是我不断返回 null。你能帮我指出我可能错在哪里吗?我正在使用when().thenReturn(),我觉得我正确地模拟了返回变量。提前谢谢了。我是 JUnit 和 Mockito 的新手,所以如果我遗漏了任何明显的内容,我深表歉意。
ServiceTest.java
@IntegrationTest
public class ServiceTest extends TransactionalTest {
private HistoryService orderHistoryService;
private CMSSiteModel website;
@Mock
protected DefaultWebService orderDetailsServiceWrapper;
@Mock
protected WebsiteService websiteService;
@Before
public void setUp()
{
MockitoAnnotations.initMocks(this);
website = mock(CMSSiteModel.class);
}
@Test
public void testFindOrderDetailsByConfirmationNumber() {
when(websiteService.getCurrentSite()).thenReturn(website);
final ResponseType response = orderHistoryService.findOrderDetailsByConfirmationNumber(OrderTestUtils.CONFIRMATION_NUMBER, OrderTestUtils.LOCATION_NUMBER);
Assert.assertEquals("Incorrect Approver Name", OrderTestUtils.APPROVER_NAME, response.getApprovedByName());
}
和Service.java
public class HistoryService implements OrderHistoryService {
@Autowired
private WebsiteService websiteService;
@Override
public OrderDetailsServiceResponseType findOrderDetailsByConfirmationNumber(String confirmationNumber, String locationNumber) {
CMSSiteModel test = websiteService.getCurrentSite(); //returning null
odsrHeader.setSource(test.getOrderSource());
}
}
最佳答案
我认为您假设 Mockito 会自动将 WebsiteService
注入(inject) OrderHistoryService
中。在 Mockito 执行此操作之前,您需要使用 @InjectMocks
注释 OrderHistoryService
。 InjectMocks
将创建该类的普通实例,然后尝试使用作为给定测试的一部分创建的任何模拟类或 spy 类来填充其字段。
例如。
public class ServiceTest extends TransactionalTest {
@InjectMocks
HistoryService orderHistoryService;
@Mock
WebsiteService websiteService;
...
}
HistoryService 中的 websiteService
不是 null
令人担忧。似乎某个地方正在发生其他注入(inject),并且您最终得到了两个单独的模拟网站服务。一个在您的测试类中,另一个在 HistoryService
中。您似乎遗漏了相当多的测试类,因此很难确定实际发生了什么。
关于java - 模拟方法返回 Null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24374941/