mocked方法返回Null

时间:2014-06-23 20:41:01

标签: java junit integration-testing mockito

我试图模拟一些方法调用但不幸的是我一直在返回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());

    }

}

2 个答案:

答案 0 :(得分:1)

我认为你假设Mockito会自动将WebsiteService注入OrderHistoryService。在Mockito执行此操作之前,您需要使用OrderHistoryService@InjectMocks进行注释。 InjectMocks将创建该类的普通实例,然后尝试使用作为给定测试的一部分创建的任何模拟或间谍类填充其字段。

例如

public class ServiceTest extends TransactionalTest {
    @InjectMocks
    HistoryService orderHistoryService;

    @Mock
    WebsiteService websiteService;

    ...

}

websiteService中的HistoryService不是null令人担忧。似乎某些其他注入正在某处发生,你最终得到了两个独立的模拟网站服务。一个在测试类中,另一个在HistoryService中。你似乎遗漏了一些测试类,所以很难确定实际发生了什么。

答案 1 :(得分:0)

以下是我的答案:[尝试在一个班级中编写单元测试用例]

确保服务类中的websiteService@Mock