当前位置: 首页 > 知识库问答 >
问题:

mocked方法返回Null

秦俊友
2023-03-14

我试图模拟一些方法调用,但不幸的是我一直返回null。你能帮我指出我可能出错的地方吗?我正在使用time(). thenBack(),我觉得我正确地模拟了返回变量。事先非常感谢。我是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个答案

彭鹭洋
2023-03-14

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

确保websiteService是Service Class中的@Mock

钱黎明
2023-03-14

我认为您假设Mockito会自动将Web站点服务注入到OrderHistoryService中。在Mockito执行此操作之前,需要使用InjectMocks对OrderHistoryService进行注释<代码>InjectMock将创建该类的一个普通实例,然后尝试用作为给定测试一部分创建的任何Mock或spy类填充其字段。

eg.

public class ServiceTest extends TransactionalTest {
    @InjectMocks
    HistoryService orderHistoryService;

    @Mock
    WebsiteService websiteService;

    ...

}

历史服务中的websiteService不是null令人担忧。似乎在某个地方发生了其他注入,您最终得到了两个单独的模拟网站服务。一个在您的测试类中,另一个在历史服务中。您似乎遗漏了相当多的测试类,因此很难确定实际发生了什么。

 类似资料:
  • 我不确定我是否滥用了基于交互的测试,或者我是否做了一些概念上的错误。我正在开发一个Spring Boot应用程序(Kotlin),我的测试使用的是Spock/Groovy。 我有一个正在测试的类,它调用另一个服务来查询信息。被测试的类应该缓存结果。但是,我不能用返回值模拟一个方法并检查调用的次数,因为当我添加调用检查时,被模拟的方法总是返回null。 我创建了一个独立的示例,演示了这个问题。 前两

  • 最简单的例子:我有以下方法: 我想模拟此方法以返回传递的参数作为结果。例如: 我知道我可以硬编码这种行为,但我希望它是通用的。

  • 公共方法getA()的测试按预期工作,但私有方法getB()的测试不返回模拟值“b”,而是返回与方法getB()的实际返回值相对应的“b”。必须如何调整对getB()的测试,以便返回模拟值“b”?

  • 问题内容: 我有一类这样的方法: 我如何在另一个类中调用此方法? 问题答案: 1. 如果要从中调用该方法的类位于同一包中,则创建该类的实例并调用该方法。 2. 使用 3. 最好有个赞等等。 例如:

  • 我实现了一个模拟ExecutorService来立即返回结果,而无需创建线程: 问题是它总是返回相同的[mocked]Future对象。我需要根据传递给执行器的可调用对象返回Future mock的新实例ServiceMock.submit()我尝试使用PowerMock.expectNew(Future.class),但它抱怨“在类'java.util.concurrent.Future'中找不