java - 模拟方法返回 Null

标签 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());

    }

}

最佳答案

我认为您假设 Mockito 会自动将 WebsiteService 注入(inject) OrderHistoryService 中。在 Mockito 执行此操作之前,您需要使用 @InjectMocks 注释 OrderHistoryServiceInjectMocks 将创建该类的普通实例,然后尝试使用作为给定测试的一部分创建的任何模拟类或 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/

相关文章:

java - 从源代码中提取时,我的模块似乎没有在 IntelliJ 中正确设置

java - 访问标识符的真实示例 [public, protected, private]

java - 无法正确应用其余 Controller junit 测试

java - 在 Android JUnit 测试中加载 native 库

java - Jenkins 不执行 Junit 测试类(Maven 项目)

java - 线程中出现异常 "main"java.lang.UnsatisfiedLinkError : sample. HelloWorld.print()V

java - JNA 的 Void* 示例

java - 如何使用 Maven 通过注释值搜索并运行 TestNG 测试方法?

ruby-on-rails - 我的 Rails 应用程序外部端点的集成测试的良好做法?

ruby-on-rails - 有没有办法向 Rails 脚手架生成器添加规范/功能