gpt4 book ai didi

java - Mockito:如何替换被测类调用的类的方法?

转载 作者:搜寻专家 更新时间:2023-10-30 21:29:58 27 4
gpt4 key购买 nike

不幸的是,Mockito 文档缺乏详尽的信息,很难找到创建以下设置的正确方法。

我有一个应该测试的类“ResourceManager”。这个类实例化另一个类“JerseyClient”,它有一个名为“get”的方法。我希望“ResourceManager”不要调用真正的“JerseyClient”,而是从中调用一个模拟(或 stub ?)(我已经不清楚模拟和 stub 或模拟和 spy 之间的区别是什么Mockito 上下文)。

我的尝试是@Mock(或@Spy?)JerseyClient,或至少其中的一种方法:

@RunWith(MockitoJUnitRunner.class)
public class ResourceManagerTest
{
@Mock
private JerseyClient jerseyClient;


@Test
public void testResultHandling() throws JsonGenerationException, JsonMappingException, IOException, ResourceException
{
TestEntity testEntity = new TestEntity();
ResourceManager resourceManager = new ResourceManager();

testEntity.setGet(true);
testEntity.setTestAttribute("1stTest");

when(jerseyClient.get(anyString())).thenReturn("{\"get\":true,\"testAttribute\":\"2ndTest\",\"message\":\"success\"}");

// doReturn("{\"get\":true,\"testAttribute\":\"2ndTest\",\"message\":\"success\"}").when(jerseyClient).get(anyString());

TestEntity result = (TestEntity)resourceManager.execute(testEntity, TestEntity.class);

assertThat(result, is(notNullValue()));
assertThat(result.getMessage(), is("success"));
assertThat(result.getTestAttribute(), is("2ndTest"));
}
}

如您所见,我尝试模拟 jerseyClient.get() 方法以返回预定义的 JSON 字符串:

when(jerseyClient.get(anyString())).thenReturn("{\"get\":true,\"testAttribute\":\"2ndTest\",\"message\":\"success\"}");

doReturn("{\"get\":true,\"testAttribute\":\"2ndTest\",\"message\":\"success\"}").when(jerseyClient).get(anyString());

但是它们都不起作用。这意味着真正的 JerseyClient.get 方法被调用,因为它试图用真正的 JerseyClient 发出 HTTP 请求。

解决方案是什么?我想在这里做什么?它是在监视一个真实的对象还是在我想模拟它的方法的地方模拟一个对象,我什么时候可以替换方法,只能在模拟上还是只能在 spy 上?

最佳答案

我自己找到了答案。我需要添加

@InjectMocks
private ResourceManager resourceManager;

然后我需要用这个实例运行测试:

@RunWith(MockitoJUnitRunner.class)
public class ResourceManagerTest
{
@Mock
private JerseyClient jerseyClient;

@InjectMocks
private ResourceManager resourceManager;

@Test
public void testResultHandling() throws JsonGenerationException, JsonMappingException, IOException, ResourceException
{
TestEntity testEntity = new TestEntity();

testEntity.setGet(true);
testEntity.setTestAttribute("1stTest");

when(jerseyClient.get(anyString())).thenReturn("{\"get\":true,\"testAttribute\":\"2ndTest\",\"message\":\"success\"}");

TestEntity result = (TestEntity)resourceManager.execute(testEntity, TestEntity.class);

assertThat(result, is(notNullValue()));
assertThat(result.getMessage(), is("success"));
assertThat(result.getTestAttribute(), is("2ndTest"));
}
}

我还可以使用“doReturn...when”模式。

关于java - Mockito:如何替换被测类调用的类的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17000473/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com